用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定時調用。