基于SchedulingConfigurer实现多定时任务注册及动态修改执行周期
Java中实现定时任务有三种方式:
1.JDK自带的Timer
2.Spring中的Spring Task
3.借助第三方的Quartz
工作中常用的是Spring Task和Quartz,今天主要用一下Spring Task。
Spring Task有两种实现方式:
1.@Scheduled(cron表达式)
2.基于SchedulingConfigurer注册定时任务
这两者的区别主要有
1.@Scheduled不支持动态修改定时周期,只能停止服务器,修改cron表达式,再启动服务器;SchedulingConfigurer可以动态修改
2.@Scheduled只能是单线程,而SchedulingConfigurer默认是单线程,可以通过添加线程池,实现多线程下定时任务的运行
接下来我们一步步操作下基于SchedulingConfigurer的定时任务实现
一、在Spring Boot中实现一个简单的定时任务,熟悉ScheduledTaskRegistrar的用法
/**
* 先注册,后执行(根据返回的时间执行)
**/
@EnableScheduling
@Slf4j
@Configuration
public class TaskConfig implements SchedulingConfigurer {
private String cron = "0 0/5 * * * ?";
@Override
public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
log.info("***************初始化定时任务设置开始*************");
//lambda表达式实现简单的任务逻辑
scheduledTaskRegistrar.addTriggerTask(() -> {
log.info("执行了定时任务");
},sheduledConfig->{
//设置定时任务的执行频率并返回下次执行时间
Date date = new CronTrigger(cron).nextExecutionTime(sheduledConfig);
log.info("执行定时任务的时间:" + formatDate(date));
return date;
}