spring的定时任务出现异常不再执行

2019-03-17 08:32

spring开启定时任务很简单,@EnableScheduling。在容器管理的类中定义一个方法,注解上@Scheduled(cron = "0 0/5 * * * ?")之类就可以。

此实现Spring会创建一个默认线程池,是单线程(single-threaded),ScheduledAnnotationBeanPostProcessor 类和ScheduledTaskRegistrar#scheduleTasks()

若是遇到未捕获的异常,线程被打断,间隔的时间后不会再次运行任务。若要解决有两种办法。

1. 在定时任务的方法里包一层,try catch,多个定时就需要写多处。

2. 使用配置注解类,明确指定。


@Configuration

@Slf4j
public class SchedulerConfigurer implements SchedulingConfigurer{
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {

    taskRegistrar.setScheduler( executor() );
}

private ThreadPoolTaskScheduler executor(){
    ThreadPoolTaskScheduler executor = new ThreadPoolTaskScheduler();
    executor.setPoolSize( 2 );
    executor.setAwaitTerminationSeconds( 500 );
    executor.setThreadNamePrefix( "my-scheduler-" );
    executor.setWaitForTasksToCompleteOnShutdown( true );
    executor.setErrorHandler( new ErrorHandler() {
        @Override
        public void handleError(Throwable t) {
            log.error("Scheduler ERROR",t)
        }
    } );
    executor.initialize();
    return executor;

    }
}