1. 程式人生 > >spring事件的condition使用

spring事件的condition使用

完全是自己記錄一下,真糟心啊。

在開發中使用了spring的事件機制,但是發現了一個問題:如果多個釋出的事件物件是同一個型別,而除了使用了這個事件型別作為引數的事件處理方法還是多個,那就無法區分到底要執行哪個處理方法了,除非你想每個處理方法都執行。

如下是我的事件處理程式碼宣告:

@Async
	@EventListener
	public void handleExport(ExportExcelMessage<DTO> exportMsg){
}

這裡的業務場景是非同步匯出Excel。直接用@EventListener來宣告事件處理方法。在controller中我如此呼叫:

publisher.publish(new ExportExcelMessage<>(reqDTO));

ExportExcelMessage是個事件物件,包含事件基本屬性,reqDTO就是查詢條件資料了。開始感覺沒有問題。後來突然有一個相同型別入參(reqDTO)的匯出功能。這樣處理方法就有問題了。出現處理方法的重複執行。隨便上網一查,簡單,EventListener直接加condition屬性就搞定。網上是這樣的;

@EventListener(condition="#exportMsg.source=='xxx'")

使用SPel表示式,直接引用的方法的引數名,單我試驗是不行的,異常顯示exportMsg應該是個null。估計應該能在方法引數上加註解來處理吧,就像Contrller的@WebParam一樣,但我一時也沒找到。最後,直接看人家的程式碼註釋,。。。。自己笨的可以了。如下就解決了

@EventListener(condition = "#root.args[0].source == 'xxx'")

root.args就是引數的陣列,直接用下標取就好了。誰有更優雅的方式請不吝賜教啊。