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;}
}