說明
此篇文章以 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 中的快捷跳轉按鈕
@EventListener
註解屬性說明
@EventListener(value = {AccountCreatedEvent.class, AccountUpdatedEvent.class}, condition = "#event.account.age > 10")
public void processAccountCreatedEvent2(AccountEvent event) {
// TODO
}
複製程式碼
value
和classes
作用相同,表示監聽的一個或一組事件,用於支援方法中同一個父類的事件,例如AccountEvent
;condition
表示式,支援 Spring el,用來做 event 中的變數或者方法判斷。
監聽執行順序
可以使用 @Order(100)
註解來標記事件的監聽執行順序,非同步的情況下只保證按順序將監聽器丟入進執行緒池,具體執行得看執行緒的心情 -.-
監聽非同步執行
使用 @Async
標記即可,注意前提條件是:使用 @EnableAsync
開啟 Spring 非同步。
Spring boot 配置非同步
本節以 mica 中的非同步配置為基礎講解。
非同步配置
- @EnableAsync 開啟非同步。
- @EnableScheduling 開啟定時任務。
- MicaAsyncProperties 為非同步執行緒池的配置。
非同步配置項
配置項 | 預設值 | 說明 |
---|---|---|
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 |
開源推薦
mica
Spring boot 微服務核心元件集:gitee.com/596392912/m…Avue
一款基於vue可配置化的神奇框架:gitee.com/smallweigit…pig
宇宙最強微服務(架構師必備):gitee.com/log4j/pigSpringBlade
完整的線上解決方案(企業開發必備):gitee.com/smallc/Spri…IJPay
支付SDK讓支付觸手可及:gitee.com/javen205/IJ…
關注我們
掃描上面二維碼,更多精彩內容每天推薦!