Bootstrap

动态定时任务

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值执行


👍 欢迎前往博客主页查看更多内容

👍 如果觉得不错,期待您的点赞、收藏、评论、关注

👍 ​ 如有错误欢迎指正!

;