Spring ThreadPoolTaskExecutor配置及佇列滿的異常處理
<!-- 配置執行緒池 -->
<bean id="threadPool" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<property name="corePoolSize" value="5" />
<property name="keepAliveSeconds" value="30000" />
<property name="maxPoolSize" value="50" />
<property name="queueCapacity" value="100" />
</bean>
corePoolSize:預設開啟執行緒數;maxPoolSize:最大執行緒數;queueCapacity:緩衝任務佇列的長度;
建立執行緒的方式:
@Autowired
private ThreadPoolTaskExecutor threadPool;
threadPoolTaskExecutor.execute(new Runnable() {
public void run() {
//非同步任務
}
});
Spring ThreadPoolTaskExecutor沒有使用阻塞模式將任務加入到物件中,因此物件滿的時候會丟擲異常,對於這種情況,一般的企業執行環境不能無限制的增大記憶體佇列容量,因此不得不阻塞佇列的加入,spring內建提供的異常處理機制不好用,因為ThreadPoolExecutor.CallerRunsPolicy的處理方式是將異常任務放在呼叫執行緒中執行,這樣對於單個執行時間長的任務,即使佇列有空閒了,剩下的任務也要等這個任務在主執行緒執行完了才能繼續往佇列裡面新增。有一個處理方法就是捕獲executor.execute()的異常,只要發現有異常就等待一段時間,直到沒有異常為止,這樣就能模仿阻塞佇列的效果,下面是程式碼:
while(true){
try{
taskExecutor.execute(new MailSender(tUserIssueInfo));
break;
}catch(TaskRejectedException e){
try{
Thread.sleep(1000);
}catch(Exception e2){}
}
}