一。Spring提供了两种调度任务的方式。
调度任务,@Scheduled
异步任务,@Async
1,定时任务单线程执行的时间问题。
@Component
public class TestTask {
@Scheduled(fixedRate = 1000 * 10) //每10秒执行一次
public void aTask(){
try {
TimeUnit.SECONDS.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sdf.format(DateTime.now().toDate())+"*********A任务每10秒执行一次进入测试");
}
}
@Component
public class TestTask2 {
@Scheduled(fixedRate = 5000) //每5秒执行一次
public void bTask(){
DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sdf.format(DateTime.now().toDate())+"*********B任务每5秒执行一次进入测试");
}
}
@Configuration
@EnableAsync
@EnableScheduling
public class AppConfig {
}
@Configuration//配置定时任务的线程池,支持定时任务并行处理
public class ScheduleConfig implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.setScheduler(taskExecutor());
}
@Bean(destroyMethod="shutdown")
public Executor taskExecutor() {
return Executors.newScheduledThreadPool(100);
}
}
@Configuration
public class AsyncConfig implements AsyncConfigurer {
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(7);
executor.setMaxPoolSize(42);
executor.setQueueCapacity(11);
executor.setThreadNamePrefix("MyExecutor-");
executor.initialize();
return executor;
}
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return new MyAsyncUncaughtExceptionHandler();
}
}
二,用法解释
1,@Scheduled注解,添加到方法上,周期性的调用该方法
简单的周期性的任务simple periodic scheduling
@Scheduled(initialDelay=1000, fixedRate=5000)
public void doSomething() {
// something that should execute periodically
}
@Scheduled(fixedDelay=5000)
public void doSomething() {
// something that should execute periodically
}
@Scheduled(fixedRate=5000)
public void doSomething() {
// something that should execute periodically
}
2,cron表达式。
@Scheduled(cron="*/5 * * * * MON-FRI")
public void doSomething() {
// something that should execute on weekdays only
}
三,配置定时任务的线程池。
public class AppConfig implements SchedulingConfigurer{
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
logger.info("Configure task registor: {}", taskRegistrar);
taskRegistrar.setScheduler(taskExecutor());
}
@Bean(destroyMethod="shutdown")
public Executor taskExecutor() {
return Executors.newScheduledThreadPool(20);
}
}