Spring 異步TaskExecutor

Spring  org.springframework.core.task.TaskExecutor
        org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor

Spring的TaskExecutor接口等同於java.util.concurrent.Executor接口。 實際上,它存在的主要原因是爲了在使用線程池的時候,將對Java 5的依賴抽象出來。 這個接口只有一個方法execute(Runnable task),它根據線程池的語義和配置,來接受一個執行任務。

 /**
	 * 異步調用
	 */
	private TaskExecutor taskExecutor;

	public TaskExecutor getTaskExecutor() {
		return taskExecutor;
	}

	public void setTaskExecutor(TaskExecutor taskExecutor) {
		this.taskExecutor = taskExecutor;
	}
	
	public void testTask(){
		taskExecutor.execute(new Runnable() {
			
			@Override
			public void run() {
				//業務邏輯
			}
		});
	}
<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">        
    <!-- 核心線程數,默認爲1 -->        
    <property name="corePoolSize" value="10" />        
    <!-- 最大線程數,默認爲Integer.MAX_VALUE -->        
    <property name="maxPoolSize" value="50" />        
    <!-- 隊列最大長度,一般需要設置值>=notifyScheduledMainExecutor.maxNum;默認爲Integer.MAX_VALUE -->        
    <property name="queueCapacity" value="1000" />        
    <!-- 線程池維護線程所允許的空閒時間,默認爲60s -->        
    <property name="keepAliveSeconds" value="300" />        
    <!-- 線程池對拒絕任務(無線程可用)的處理策略,目前只支持AbortPolicy、CallerRunsPolicy;默認爲後者 -->        
    <property name="rejectedExecutionHandler">        
        <!-- AbortPolicy:直接拋出java.util.concurrent.RejectedExecutionException異常 -->        
        <!-- CallerRunsPolicy:主線程直接執行該任務,執行完之後嘗試添加下一個任務到線程池中,可以有效降低向線程池內添加任務的速度 -->        
        <!-- DiscardOldestPolicy:拋棄舊的任務、暫不支持;會導致被丟棄的任務無法再次被執行 -->        
        <!-- DiscardPolicy:拋棄當前任務、暫不支持;會導致被丟棄的任務無法再次被執行 -->        
        <bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy" />        
    </property>        
</bean>  
 

在Spring發行包中預定義了一些TaskExecutor實現。有了它們,你甚至不需要再自行實現了。
SimpleAsyncTaskExecutor 類
這個實現不重用任何線程,或者說它每次調用都啓動一個新線程。但是,它還是支持對併發總數設限,當超過線程併發總數限制時,阻塞新的調用,直到有位置被釋放。如果你需要真正的池,請繼續往下看。
SyncTaskExecutor類
這個實現不會異步執行。相反,每次調用都在發起調用的線程中執行。它的主要用處是在不需要多線程的時候,比如簡單的test case。
ConcurrentTaskExecutor 類
這個實現是對Java 5 java.util.concurrent.Executor類的包裝。有另一個備選, ThreadPoolTaskExecutor類,它暴露了Executor的配置參數作爲bean屬性。很少需要使用ConcurrentTaskExecutor, 但是如果ThreadPoolTaskExecutor不敷所需,ConcurrentTaskExecutor是另外一個備選。
SimpleThreadPoolTaskExecutor 類
這個實現實際上是Quartz的SimpleThreadPool類的子類,它會監聽Spring的生命週期回調。當你有線程池,需要在Quartz和非Quartz組件中共用時,這是它的典型用處。
ThreadPoolTaskExecutor 類
它不支持任何對java.util.concurrent包的替換或者下行移植。Doug Lea和Dawid Kurzyniec對java.util.concurrent的實現都採用了不同的包結構,導致它們無法正確運行。
這個實現只能在Java 5環境中使用,但是卻是這個環境中最常用的。它暴露的bean properties可以用來配置一個java.util.concurrent.ThreadPoolExecutor,把它包裝到一個TaskExecutor中。如果你需要更加先進的類,比如ScheduledThreadPoolExecutor,我們建議你使用ConcurrentTaskExecutor來替代。
TimerTaskExecutor類
這個實現使用一個TimerTask作爲其背後的實現。它和SyncTaskExecutor的不同在於,方法調用是在一個獨立的線程中進行的,雖然在那個線程中是同步的。
WorkManagerTaskExecutor類
CommonJ 是BEA和IBM聯合開發的一套規範。這些規範並非Java EE的標準,但它是BEA和IBM的應用服務器實現的共同標準
這個實現使用了CommonJ WorkManager作爲其底層實現,是在Spring context中配置CommonJ WorkManager應用的最重要的類。和SimpleThreadPoolTaskExecutor類似,這個類實現了WorkManager接口,因此可以直接作爲WorkManager使用。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章