原因來自於系統有兩天定時任務執行失敗,查閱日志時,只能看到
Unexpected error occurred in scheduled task.
在Spring 源碼中,可以從TaskUtils
中看出端倪,Spring 默認提供的定時任務處理器是
LoggingErrorHandler
private static class LoggingErrorHandler implements ErrorHandler {
private final Log logger = LogFactory.getLog(LoggingErrorHandler.class);
@Override
public void handleError(Throwable t) {
if (logger.isErrorEnabled()) {
logger.error("Unexpected error occurred in scheduled task.", t);
}
}
}
那么為了能夠在定時任務發生異常時看到完整的異常信息,需要我們特別配置下
主要的工作還是在Spring.xml
一般地,想要使用Spring基於注解的定時任務,我們只需要在XML文件中配置
<task:annotation-driven/>
所以加入自己的配置也很簡單,只需要展開即可。默認情況下,Spring 啟用的是 org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler
,我們不改變這個依舊配置
ThreadPoolTaskScheduler
為任務調度
<task:annotation-driven scheduler="default" />
//加入一些個性配置,比如線程池大小
<bean name="taskDefault" class="org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler">
<property name="poolSize" value="5"/>
//配置自定義異常處理
<property name="errorHandler" ref="scheduleTaskErrorHandler"/>
</bean>
//注冊到Spring 容器
<bean name="scheduleTaskErrorHandler" class="com.ScheduleTaskErrorHandler"/>
ScheduleTaskErrorHandler.java
@Override
public void handleError(Throwable throwable) {
logger.error("Schedule task throw exception msg is {}");
throwable.printStackTrace();
}