Spring TaskScheduler
本文以SpringBoot2.7.3 版本来讲解自动装配TaskScheduler,Spring TaskScheduler 是在Jdk
ScheduledThreadPoolExecutor的基础上进行的扩展,默认调度是阻塞的话,如果某一个task未执行,下一个调度执行就会被推迟。
相关注解
注解 | 说明 |
---|---|
@EnableScheduling | 开启spring 调度 |
@Scheduled | 定义task 调度周期配置,只能作用于方法上,指定crontab 表达式、指定固定周期、支持延迟 |
@Schedules | 支持定义多个@Scheduled |
关键类
实现task被调度有哪些方式
- 注解方式
通过@Scheduled或者@Schedules来实现task周期性执行 - 编程方式
实现SchedulingConfigurer类,实现configureTasks
demo
- 注解方式
@Configuration(proxyBeanMethods = false)
public class CustomerTask {
@Scheduled(fixedRate = 1, timeUnit = TimeUnit.SECONDS)
@Async
public void doCustomerTask() {
System.out.println(Thread.currentThread().getName() + " do customer task");
}
@Schedules(value = {@Scheduled(cron = "*/10 * * * * MON-FRI")})
@Async
//任务执行周期是10秒一次,但是任务执行耗时是大于10,由于ScheduledThreadPoolExecutor调度使用阻塞队列,所以任务将会被推迟执行
public void doCustomerTask1() throws InterruptedException {
System.out.println(new Date() + "do customer task1 start");
TimeUnit.SECONDS.sleep(11);
System.out.println(Thread.currentThread().getName() + "do customer task1");
System.out.println(new Date() + "do customer task1 end");
}
}
- 编程方式
/**
* 通过编程方式创建task
*/
@Configuration(proxyBeanMethods = false)
public class MySchedulingConfigurer implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
Runnable runnable = () -> {
System.out.println(new Date() + Thread.currentThread().getName() + " configureTasks ");
};
taskRegistrar.addFixedDelayTask(new IntervalTask(runnable, 1000 * 11, 0));
taskRegistrar.addFixedDelayTask(new IntervalTask(runnable, 1000 * 11, 0));
taskRegistrar.addTriggerTask(runnable, new PeriodicTrigger(5, TimeUnit.SECONDS));
}
}