Spring event 使用徹底指南

說明

此篇文章以 Spring 4.2+ 爲例,在此版本以前略微有不一樣。 筆者自2014年起開始接觸和使用 Spring event,根據 Spring event 的原理開發了 JFinal-event: gitee.com/596392912/J… ,方便 JFinal 用戶使用,JFinal event 2.x 也同步成 Spring 4.2.x+ 的使用方式,再也不須要建立多個 Listener 類,使用更加簡單方便。vue

使用

建立 Event 事件監聽

Spring 4.2+ 中再也不須要單獨編寫監聽器類,只須要在 Spring Bean 的方法上標記 @EventListener 註解便可。java

示例:多個監聽器,監聽 Account 建立,完成不一樣的業務邏輯。git

/** * 帳號監聽,處理帳號建立成功的後續邏輯 */
@Component
public class AccountListener {

	/** * 1. 發送郵件、短信 */
    @EventListener
    public void processAccountCreatedEvent1(AccountCreatedEvent event) {
        // TODO
    }

    /** * 2. 添加積分等,@Order(100) 用來設定執行順序 */
    @EventListener
    @Order(100)
    public void processAccountCreatedEvent2(AccountCreatedEvent event) {
        // TODO
    }

    /** * 3. 建立 lucene 索引等,@Async 用來標記爲異步線程池中執行 */
    @EventListener
    @Async
    public void processAccountCreatedEvent3(AccountCreatedEvent event) {
        // TODO
    }
}
複製代碼

發送 Event 事件

示例:mybatis中發送帳號建立事件。spring

注意:若是你是使用的 jpa,jpa 也有對應的事件機制,不須要像下面手動處理。數據庫

/** * 注入 ApplicationEventPublisher */
@Autowired
private ApplicationEventPublisher publisher;

@Override
public boolean save(Account account) {
	// 僞代碼,數據庫保存成功
	if (true) {
		publisher.publishEvent(new AccountCreatedEvent(account));
	}
	return false;
}
複製代碼

idea 中的快捷跳轉按鈕

spring-event.mp4.gif

@EventListener 註解屬性說明

@EventListener(value = {AccountCreatedEvent.class, AccountUpdatedEvent.class}, condition = "#event.account.age > 10")
public void processAccountCreatedEvent2(AccountEvent event) {
	// TODO
}
複製代碼
  • valueclasses 做用相同,表示監聽的一個或一組事件,用於支持方法中同一個父類的事件,例如 AccountEvent;
  • condition 表達式,支持 Spring el,用來作 event 中的變量或者方法判斷。

監聽執行順序

能夠使用 @Order(100) 註解來標記事件的監聽執行順序,異步的狀況下只保證按順序將監聽器丟入進線程池,具體執行得看線程的心情 -.-mybatis

監聽異步執行

使用 @Async 標記便可,注意前提條件是:使用 @EnableAsync 開啓 Spring 異步。架構

Spring boot 配置異步

本節以 mica 中的異步配置爲基礎講解。框架

異步配置

  • @EnableAsync 開啓異步。
  • @EnableScheduling 開啓定時任務。
  • MicaAsyncProperties 爲異步線程池的配置。

QQ20190409-164911@2x.png

異步配置項

QQ20190409-164945@2x.png

配置項 默認值 說明
mica.async.core-pool-size 2 異步核心線程數,默認:2
mica.async.keep-alive-seconds 300 線程存活時間,默認:300
mica.async.max-pool-size 50 異步最大線程數,默認:50
mica.async.queue-capacity 10000 隊列容量,默認:10000

開源推薦

關注咱們

如夢技術-公衆號.jpg

掃描上面二維碼,更多精彩內容天天推薦!異步

相關文章
相關標籤/搜索