spring boot task实现动态创建定时任务的方法
在Spring Boot项目中,通过@EnableScheduling可启用Spring自带的定时任务支持,在通过@Scheduled注解定义定时任务,但是通过注解只能编写固定时间的定时任务,无法动态调整定时间隔,可通过实现SchedulingConfigurer接口实现动态定时任务注册。
对比Quartz的优缺点
优点:配置非常简单
缺点:
- 不支持分布式部署
- 不支持动态配置定时任务
- 不支持持久化
其实这几个缺点归根结底都是因为不支持持久化,所以如果项目需要持久化定时任务,还是要选择Quartz比较好。
参考代码:
package org.cent.demo.scanner.schedule; import lombok.AllArgsConstructor; import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.Trigger; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.SchedulingConfigurer; import org.springframework.scheduling.config.ScheduledTaskRegistrar; import org.springframework.scheduling.support.CronTrigger; import java.util.Arrays; import java.util.List; /** * @author: cent * @email: 292462859@qq.com * @date: 2019/1/16. * @description: */ @Configuration @EnableScheduling @Slf4j public class DynamicSchedule implements SchedulingConfigurer { /** * 测试数据,实际可从数据库获取 */ private List<Task> tasks = Arrays.asList( new Task(1, "任务1", "*/30 * * * * *"), new Task(2, "任务2", "*/30 * * * * *"), new Task(3, "任务3", "*/30 * * * * *"), new Task(4, "任务4", "*/30 * * * * *"), new Task(5, "任务5", "*/30 * * * * *"), new Task(6, "任务6", "*/30 * * * * *"), new Task(7, "任务7", "*/30 * * * * *"), new Task(8, "任务8", "*/30 * * * * *"), new Task(9, "任务9", "*/30 * * * * *"), new Task(10, "任务10", "*/30 * * * * *") ); @Override public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) { tasks.forEach(task -> { //任务执行线程 Runnable runnable = () -> log.info("execute task {}", task.getId()); //任务触发器 Trigger trigger = triggerContext -> { //获取定时触发器,这里可以每次从数据库获取最新记录,更新触发器,实现定时间隔的动态调整 CronTrigger cronTrigger = new CronTrigger(task.getCron()); return cronTrigger.nextExecutionTime(triggerContext); }; //注册任务 scheduledTaskRegistrar.addTriggerTask(runnable, trigger); }); } @Data @AllArgsConstructor static class Task { /** * 主键ID */ private int id; /** * 任务名称 */ private String name; /** * cron表达式 */ private String cron; } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
- SpringTask实现定时任务方法讲解
- SpringBoot ScheduledTaskRegistrar解决动态定时任务思路详解
- SpringBoot定时任务动态扩展ScheduledTaskRegistrar详解
- Spring动态管理定时任务之ThreadPoolTaskScheduler解读
- 使用spring-task定时任务动态配置修改执行时间
- Spring Task定时任务每天零点执行一次的操作
- SpringBoot2 task scheduler 定时任务调度器四种方式
- java 中Spring task定时任务的深入理解
- Spring Task定时任务的配置和使用详解
- SpringTask-Timer实现定时任务的详细代码
相关文章
springboot项目部署在linux上运行的两种方式小结
这篇文章主要介绍了springboot项目部署在linux上运行的两种方式小结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-07-07Mybatis-Plus使用p6spy对SQL性能进行监控的方法
这篇文章主要介绍了Mybatis-Plus使用p6spy对SQL性能进行监控的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2020-12-12一文详解Java中的可变对象(Mutable)与不可变对象(Immutable)
如何在 Java 中创建不可变对象?我以前以为所有对象都是不可变的,因为如果你改变一个 String 实例的内容,它总是会创建一个新的 String 对象并指向该对象,在本文中,我不仅将分享在 Java 中Immutable的步骤,还将讨论可变对象与不可变对象及其优缺点2023-11-11SpringBoot如何获取application.properties中自定义的值
这篇文章主要介绍了SpringBoot获取application.properties中的自定义的值,目录结构文件代码给大家列举的非常详细,需要的朋友可以参考下2021-09-09SpringBoot+Shiro学习之密码加密和登录失败次数限制示例
本篇文章主要介绍了SpringBoot+Shiro学习之密码加密和登录失败次数限制示例,可以限制登陆次数,有兴趣的同学可以了解一下。2017-03-03
最新评论