一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|JavaScript|易語言|

服務器之家 - 編程語言 - Java教程 - 使用Spring事件機制實現異步的方法

使用Spring事件機制實現異步的方法

2021-05-10 11:05Joepis Java教程

這篇文章主要介紹了使用Spring事件機制實現異步的方法,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

當把一個事件發布到spring提供的applicationcontext中,被監聽器偵測到,就會執行對應的處理方法。

事件本身
事件是一個自定義的類,需要繼承spring提供的applicationevent

?
1
2
3
4
5
6
7
8
9
@data
public class myevent extends applicationevent {
  private string msg;
 
  public myevent(object source, string msg) {
    super(source);
    this.msg = msg;
  }
}

事件監聽

基本方法是實現applicationlistener接口,自定義一個監聽器,實現onapplicationevent()方法,然后添加到applicationcontext

比如:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class mylistener implements applicationlistener<myevent> {
 
  @override
  public void onapplicationevent(myevent event) {
    system.out.print("監聽到myevent事件");
  }
}
...
// springboot的啟動類中添加監聽器
    public static void main(string[] args) {
    springapplication application = new springapplication(myapplication.class);
    application.addlisteners(new mylistener());
    application.run(args);
  }

也可以使用注解@eventlistener(推薦):原理就是通過掃描這個注解,創建監聽器并添加到applicationcontext

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@component
@slf4j
public class myeventhandler {
 
  @eventlistener
  public void handleevent(myevent event) {
    log.info("------------處理事件:{}", event.getmsg());
    try {
      thread.sleep(5 * 1000l);
      log.info("事件1(5s)處理完成");
    } catch (interruptedexception e) {
      e.printstacktrace();
    }
  }
 
}

事件發布

可以通過上下文對象的發布方法configurableapplicationcontext::publishevent()來發布。

也可以實現applicationeventpublisheraware接口來發布(推薦)。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@component
@slf4j
public class eventservice implements applicationeventpublisheraware {
  public applicationeventpublisher publisher;
 
  @override
  public void setapplicationeventpublisher(applicationeventpublisher applicationeventpublisher) {
    this.publisher = applicationeventpublisher;
  }
 
  public string doeventwork(string msg) {
    log.info("------------publish event:" + msg);
    myevent event = new myevent(this, msg);
    publisher.publishevent(event);
    return "ok";
  }
}

測試代碼

?
1
2
3
4
5
6
7
8
9
10
11
12
@springboottest
@runwith(springrunner.class)
public class eventservicetest {
  @autowired
  private eventservice service;
 
  @test
  public void eventtest() {
    string msg="java code";
    service.doeventwork(msg);
  }
}

使用Spring事件機制實現異步的方法

注意

如果2個事件之間是繼承關系,會先監聽到子類事件,處理完再監聽父類。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// myevent2 extends myevent
 
@component
@slf4j
public class myeventhandler {
 
  @eventlistener
  public void handleevent(myevent event) {
    log.info("------------處理事件:{}", event.getmsg());
    try {
      thread.sleep(5 * 1000l);
      log.info("事件1(5s)處理完成");
    } catch (interruptedexception e) {
      e.printstacktrace();
    }
  }
 
  @eventlistener
  public void handleevent2(myevent2 event) {
    log.info("------------處理事件2:{}", event.getmsg());
    try {
      thread.sleep(10 * 1000l);
      log.info("事件2(10s)處理完成");
    } catch (interruptedexception e) {
      e.printstacktrace();
    }
  }
}

當我publish一個子類事件myevent2時,日志如下:

使用Spring事件機制實現異步的方法

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:https://www.jianshu.com/p/47ae0bbdf205

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 性美国人xxxxx18 | 深夜在线影院 | 欧美free激情野战hd | 国产在线看片护士免费视频 | 91制片厂 果冻传媒 天美传媒 | 大又大又粗又爽女人毛片 | 啪一啪日一日 | 婷婷综合七月激情啪啪 | 动漫jk美女被爆羞羞漫画 | 毛片亚洲毛片亚洲毛片 | 天美蜜桃精东乌鸦传媒 | 亚洲香蕉视频 | 久青草国产在线观看视频 | 超爽人人做人人爽 | 亚洲 综合 欧美在线视频 | 爱欲荡漾在线观看 | 亚洲男男video | 国产愉拍 | 美味情缘韩国在线观看视频 | 日本mature乱子视频 | 五月婷婷俺也去开心 | 亚洲狠狠综合久久 | 99久久精品免费看国产情侣 | 色天使亚洲综合在线观看 | 午夜dj影院在线观看完整版 | 香蕉在线精品亚洲第一区 | 99九九国产精品免费视频 | 久久五月综合婷婷中文云霸高清 | 我的年轻漂亮继坶三级 | 色香婷婷| 失禁尿丝袜vk | 国产在线观看网站 | 色女的乖男人 | 99热最新| 苍井空色欲迷墙 | 秋霞鲁丝影院久久人人综合 | 果冻传媒天美传媒乌鸦传媒 | 小小水蜜桃视频高清在线播放 | 国产综合欧美日韩视频一区 | 国产色站 | 成人免费网址 |