Spring?@EventListener?異步中使用condition的問題及處理
@EventListener 異步中使用condition的問題
@EventListener是spring在4.2+推出的更好的使用spring事件架構(gòu)的方式,并且異步方式也很好設定
但是在spring4.2.7版本上使用eventlistener的condition 的使用需要注意以下情況可能失效:
condition 使用例子如
@EventListener(condition = "#event.isAsync")
1. 需要對同一個事件進行區(qū)分同步異步
2. 使用condition來進行過濾
例如:
需要對事件用condition進行區(qū)分同步異步
@Async @EventListener(condition = "#event.isAsync") public void handleOrderCreatedEventAsync(TestEvent event) { } @EventListener(condition = "#event.isAsync == false") public void handleOrderCreatedEvent(TestEvent event) { }
修正的做法,是使用兩個事件區(qū)分即
@Async @EventListener public void handleOrderCreatedEventAsync(TestEventAsync event) { } @EventListener public void handleOrderCreatedEvent(TestEvent event) { }
還不清楚,在更高的版本上是否已經(jīng)有進一步的修正,待以后研究
Spring事件的condition使用說明
在開發(fā)中使用了spring的事件機制,但是發(fā)現(xiàn)了一個問題:如果多個發(fā)布的事件對象是同一個類型,而除了使用了這個事件類型作為參數(shù)的事件處理方法還是多個,那就無法區(qū)分到底要執(zhí)行哪個處理方法了,除非你想每個處理方法都執(zhí)行。
如下是我的事件處理代碼聲明
@Async @EventListener public void handleExport(ExportExcelMessage<DTO> exportMsg){ }
這里的業(yè)務場景是異步導出Excel。直接用@EventListener來聲明事件處理方法。
在controller中我如此調(diào)用
publisher.publish(new ExportExcelMessage<>(reqDTO));
ExportExcelMessage是個事件對象,包含事件基本屬性,reqDTO就是查詢條件數(shù)據(jù)了。
開始感覺沒有問題。后來突然有一個相同類型入?yún)ⅲ╮eqDTO)的導出功能。
這樣處理方法就有問題了。出現(xiàn)處理方法的重復執(zhí)行。
隨便上網(wǎng)一查,簡單,EventListener直接加condition屬性就搞定。網(wǎng)上是這樣的;
@EventListener(condition="#exportMsg.source=='xxx'")
其中這個source就是ExportExcelMessage類的的一個屬性,用來區(qū)分到底是誰發(fā)起的事件。
使用SPel表達式,直接引用的方法的參數(shù)名,單我試驗是不行的,異常顯示exportMsg應該是個null。
估計應該能在方法參數(shù)上加注解來處理吧,就像Contrller的@WebParam一樣,但我一時也沒找到。
最后,直接看人家的代碼注釋,。。。。自己笨的可以了。
如下就解決了
@EventListener(condition = "#root.args[0].source == 'xxx'")
root.args就是參數(shù)的數(shù)組,直接用下標取就好了。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
JavaWeb項目FullCalendar日歷插件使用的示例代碼
本篇文章主要介紹了JavaWeb項目FullCalendar日歷插件使用的示例代碼,具有一定的參考價值,有興趣的可以了解一下2017-08-08Mybatis配置之<environments>配置元素詳解
這篇文章主要介紹了Mybatis配置之<environments>配置元素,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01解析SpringSecurity+JWT認證流程實現(xiàn)
這篇文章主要介紹了解析SpringSecurity+JWT認證流程實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-07-07