1. 程式人生 > >spring事件機制——非同步配置

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自身的非同步支援來優化。