SpringBoot定时任务
在SpringBoot中使用定时任务一般是启动类增加@EnableScheduling
注解开始定时任务,在方法上增加@Scheduled(cron = "0 0 * * * ?")
注解启动定时任务,但是这种方式如果想要改变定时任务的时间就只能修改代码才行
本文讲解如何通过接口修改cron表达式来实现动态定时任务
增加开启定时任务注解
启动类或配置类增加@EnableScheduling
注解开启定时任务这一步是一定要有的
编写定时任务service
开始编写定时任务service,该service需要实现SchedulingConfigurer
为并重写configureTasks
方法
@Service
@Slf4j
public class ScheduledTaskService implements SchedulingConfigurer {
// 初始cron值,@Setter为Lombok注解,以便于controller修改cron的值
@Setter
private String cron = "0/10 * * * * ?";
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.addTriggerTask(() -> {
// 定时任务执行内容
log.info("任务执行");
}, new Trigger() {
@Override
public Date nextExecutionTime(TriggerContext triggerContext) {
// 使用CronTrigger触发器,可动态修改cron表达式来操作循环规则
CronTrigger cronTrigger = new CronTrigger(cron);
Date nextExecutionTime = cronTrigger.nextExecutionTime(triggerContext);
return nextExecutionTime;
}
});
}
}
编写定时任务Controller
@Slf4j
@RestController
@RequestMapping("/scheduled_task")
public class ScheduledTaskController {
@Autowired
private ScheduledTaskService scheduledTaskService;
@GetMapping("/updateCron")
public String updateCron(String cron) {
log.info("new cron :{}", cron);
scheduledTaskService.setCron(cron);
return "ok";
}
}
执行结果
[INFO XX 11:30:30.030 XX.service.ScheduledTaskService lambda$configureTasks$0 31 poolScheduler1]:任务执行
[INFO XX 11:30:40.040 XX.service.ScheduledTaskService lambda$configureTasks$0 31 poolScheduler1]:任务执行
[INFO XX 11:30:50.050 XX.service.ScheduledTaskService lambda$configureTasks$0 31 poolScheduler2]:任务执行
[INFO XX 11:30:57.057 XX.ScheduledTaskController http-nio-8829-exec-3]: new cron :0/5 * * * * ?
[INFO XX 11:31:00.000 XX.service.ScheduledTaskService lambda$configureTasks$0 31 poolScheduler1]:任务执行
[INFO XX 11:31:05.005 XX.service.ScheduledTaskService lambda$configureTasks$0 31 poolScheduler3]:任务执行
[INFO XX 11:31:10.010 XX.service.ScheduledTaskService lambda$configureTasks$0 31 poolScheduler2]:任务执行
可以看到,初始是按照每10秒执行一次定时任务,在调用接口后,每5秒执行一次定时任务
需要注意,在调用完接口后不会马上按照新的cron执行,而是先将上一个定时任务执行完才会按新的cron值执行
👍 欢迎前往博客主页查看更多内容
👍 如果觉得不错,期待您的点赞、收藏、评论、关注
👍 如有错误欢迎指正!