spring事件機制——非同步配置
阿新 • • 發佈:2019-02-20
這裡講解一下Spring對非同步事件機制的支援,實現方式有兩種:
1、全域性非同步
即只要是觸發事件都是以非同步執行,具體配置(spring-config-register.xml)如下:
通過注入taskExecutor來完成非同步呼叫。具體實現可參考之前的程式碼介紹。這種方式的缺點很明顯:要麼大家都是非同步,要麼大家都不是。所以不推薦使用這種方式。
2.1、開啟非同步呼叫支援
2.2、配置監聽器讓其支援非同步呼叫
使用@Async註解即可,非常簡單。
這樣不僅可以支援通過呼叫,也支援非同步呼叫,非常的靈活,實際應用推薦大家使用這種方式。
通過如上,大體瞭解了Spring的事件機制,可以使用該機制非常簡單的完成如註冊流程,而且對於比較耗時的呼叫,可以直接使用Spring自身的非同步支援來優化。
1、全域性非同步
即只要是觸發事件都是以非同步執行,具體配置(spring-config-register.xml)如下:
<task:executor id="executor" pool-size="10" /> <!-- 名字必須是applicationEventMulticaster和messageSource是一樣的,預設找這個名字的物件 --> <!-- 名字必須是applicationEventMulticaster,因為AbstractApplicationContext預設找個 --> <!-- 如果找不到就new一個,但不是非同步呼叫而是同步呼叫 --> <bean id="applicationEventMulticaster" class="org.springframework.context.event.SimpleApplicationEventMulticaster"> <!-- 注入任務執行器 這樣就實現了非同步呼叫(缺點是全域性的,要麼全部非同步,要麼全部同步(刪除這個屬性即是同步)) --> <property name="taskExecutor" ref="executor"/> </bean>
通過注入taskExecutor來完成非同步呼叫。具體實現可參考之前的程式碼介紹。這種方式的缺點很明顯:要麼大家都是非同步,要麼大家都不是。所以不推薦使用這種方式。
2、更靈活的非同步支援
spring3提供了@Aync註解來完成非同步呼叫。此時我們可以使用這個新特性來完成非同步呼叫。不僅支援非同步呼叫,還支援簡單的任務排程,比如我的專案就去掉Quartz依賴,直接使用spring3這個新特性,具體可參考spring-config.xml。2.1、開啟非同步呼叫支援
<!-- 開啟@AspectJ AOP代理 --> <aop:aspectj-autoproxy proxy-target-class="true"/> <!-- 任務排程器 --> <task:scheduler id="scheduler" pool-size="10"/> <!-- 任務執行器 --> <task:executor id="executor" pool-size="10"/> <!--開啟註解排程支援 @Async @Scheduled--> <task:annotation-driven executor="executor" scheduler="scheduler" proxy-target-class="true"/>
2.2、配置監聽器讓其支援非同步呼叫
@Component public class EmailRegisterListener implements ApplicationListener<RegisterEvent> { @Async @Override public void onApplicationEvent(final RegisterEvent event) { System.out.println("註冊成功,傳送確認郵件給:" + ((User)event.getSource()).getUsername()); } }
使用@Async註解即可,非常簡單。
這樣不僅可以支援通過呼叫,也支援非同步呼叫,非常的靈活,實際應用推薦大家使用這種方式。
通過如上,大體瞭解了Spring的事件機制,可以使用該機制非常簡單的完成如註冊流程,而且對於比較耗時的呼叫,可以直接使用Spring自身的非同步支援來優化。