Spring event 使用完全指南

如夢技術發表於2019-04-09

說明

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

使用

建立 Event 事件監聽

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

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

/**
 * 賬號監聽,處理賬號建立成功的後續邏輯
 */
@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中傳送賬號建立事件。

注意:如果你是使用的 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) 註解來標記事件的監聽執行順序,非同步的情況下只保證按順序將監聽器丟入進執行緒池,具體執行得看執行緒的心情 -.-

監聽非同步執行

使用 @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

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

相關文章