在SpringBoot项目中简单使用定时任务,不过由于要借助cron表达式且都提前定义好放在配置文件里,不能在项目运行中动态修改任务执行时间,实在不太灵活。现在我们就来实现可以动态修改cron表达式的定时任务,感兴趣的可以了解一下
前言
之前在SpringBoot项目中简单使用定时任务,不过由于要借助cron表达式且都提前定义好放在配置文件里,不能在项目运行中动态修改任务执行时间,实在不太灵活。现在我们就来实现可以动态修改cron表达式的定时任务。
配置文件
application-task.yml,其余的配置 application.yml 等就按照springBoot正常配置即可
task:
cron: 0/10 * * * * ?
timer: 10
定时任务核心类
import cn.hutool.core.date.DateUtil;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.PeriodicTrigger;
import java.util.Date;
@Data
@Slf4j
@Configuration
@EnableScheduling
@ConfigurationProperties(prefix = "task")
public class WorkScheduleTask implements SchedulingConfigurer {
private String cron;
private Long timer;
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
// 动态使用cron表达式设置循环间隔
taskRegistrar.addTriggerTask(() -> {
String dateTime = DateUtil.formatDateTime(new Date());
String threadName = Thread.currentThread().getName();
log.info("定时任务开始[configureTasks] :{},线程:{}", dateTime, threadName);
}, triggerContext -> {
// 使用CronTrigger触发器,可动态修改cron表达式来操作循环规则
// 只能定义小于等于间隔59秒
// CronTrigger cronTrigger = new CronTrigger(cron);
// return cronTrigger.nextExecutionTime(triggerContext);
// 能定义大于等于间隔59秒
// 使用不同的触发器,为设置循环时间的关键,区别于CronTrigger触发器,
// 该触发器可随意设置循环间隔时间,单位为毫秒
long seconds = timer * 1000; // 毫秒转秒
PeriodicTrigger periodicTrigger = new PeriodicTrigger(seconds);
return periodicTrigger.nextExecutionTime(triggerContext);
});
}
}
提供修改cron表达式的controller
@Slf4j
@CrossOrigin
@RestController
@RequestMapping("/updateTask")
public class UpdateTaskController {
@Resource
private WorkScheduleTask workScheduleTask;
@PostMapping("/updateCron")
public String updateCron(String cron) {
log.info("new cron :{}", cron);
workScheduleTask.setCron(cron);
return "ok";
}
@PostMapping("/updateTimer")
public String updateTimer(Long timer) {
log.info("new timer :{}", timer);
workScheduleTask.setTimer(timer);
return "ok";
}
}
一开始定时任务的执行时机和周期都是配置文件指定的,但是我们如果对于执行的周期不满意,我们可以调用接口进行修改定时任务,但是需要注意的是,这种外暴露的接最好做一下安全校验,不是谁都可以调用,否则被别人扫描到这个接口,然后随意修改,会影响我们正常的业务流程,严重可能会造成严重损失。
到此这篇关于SpringBoot实现动态定时任务的示例代码的文章就介绍到这了,更多相关SpringBoot动态定时任务内容请搜索编程学习网以前的文章希望大家以后多多支持编程学习网!
本文标题为:SpringBoot实现动态定时任务的示例代码
基础教程推荐
- java实现多人聊天系统 2023-05-19
- JDK数组阻塞队列源码深入分析总结 2023-04-18
- Java数据结构之对象比较详解 2023-03-07
- ConditionalOnProperty配置swagger不生效问题及解决 2023-01-02
- Java并发编程进阶之线程控制篇 2023-03-07
- Java实现查找文件和替换文件内容 2023-04-06
- Java实现线程插队的示例代码 2022-09-03
- Java文件管理操作的知识点整理 2023-05-19
- springboot自定义starter方法及注解实例 2023-03-31
- java基础知识之FileInputStream流的使用 2023-08-11