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){}
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM