Spring Boot定時任務運行一段時間后自動關閉的解決辦法


用Spring Boot默認支持的 Scheduler來運行定時任務,有時在服務器運行一段時間后會自動關閉。原因:Schedule默認是單線程運行定時任務的,即使是多個不同的定時任務,默認也是單線程運行。當線程掛掉時,定時任務也隨之終止。

解決方法:

       一.改為多線程執行定時任務:

加一個配置類,實現SchedulingConfigurer接口,重寫configureTasks方法即可:

import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;

import java.util.concurrent.Executors;

/**
* 多線程執行定時任務
* @author DaiMaTanQi
* 2019年3月28日
*/
@Configuration
//用線程池給不同定時任務分配不同的線程
public class ScheduleConfig implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
//設定一個長度10的定時任務線程池
taskRegistrar.setScheduler(Executors.newScheduledThreadPool(10));
}
}

 

二.線程掛掉的原因主要有兩個,一是運行時拋出異常未被捕獲,二是調用外部接口時,http請求超時。

解決辦法:在方法最后捕獲所有異常,http請求設置超時時間:

connection.setConnectTimeout(30000);

connection.setReadTimeout(60000);

 

絕大部分定時任務掛掉情況可以通過以上方式解決,如果解決不了,建議把需要定時運行的任務寫成接口,用linux服務器的crontab定時調用。


免責聲明!

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



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