玩转 Spring Boot 集成篇(@Scheduled静态动态定时任务)
Posted 一猿小讲
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了玩转 Spring Boot 集成篇(@Scheduled静态动态定时任务)相关的知识,希望对你有一定的参考价值。
public static void main(String[] args) 2.5. 引入依赖以及相关配置 主要是完成从数据库查询指定任务名称对应的定时配置,实现方式会有很多种,不要局限于本文提及的 JPA,可参考历史分享《玩转 Spring Boot 集成篇(MyBatis、JPA、事务支持)》引入 JPA、数据库连接依赖以及 application.properties 完成数据库连接配置。 2.6. 运行验证 库中对于 downLoadTaskV3 任务默认配置的时间为每 10 秒执行一次。 控制台输出如下。 手动修改数据库,把任务执行的时间表达式修改为每 1 秒执行一次。 控制台输出效果如下,很显然已经生效了。 至此,定时任务的时间就可以动态修改生效了,若再实现一个页面进行修改任务执行时间的值,其实也挺爽。 这种方案其实可以称为是简易版的 Quartz,在一定程度上也能解决一定的业务场景问题,但是若做更复杂的动作,例如启停任务、删除任务等等操作,实现起来则稍显复杂,此时便可以通过集成 Quartz 等开源任务框架来实现,而鉴于集成 Quartz 框架的动态管理任务代码较多咱们下一篇再分享。 3. 例行回顾 本文是 Spring Boot 项目集成定时任务首篇讲解,主要分享了如下部分: Spring Boot 内置注解实现静态定时任务; 提了一嘴四种任务时间配置格式; 分享了如何开启多线程跑任务? 尝试实现了动态定时任务。 玩转 Spring Boot 集成定时任务首篇就写到这里,下次一起集成 Quratz 框架并实现任务动态管理。 一起聊技术、谈业务、喷架构,少走弯路,不踩大坑,会持续输出更多精彩分享,欢迎关注,敬请期待! 历史系列文章: 玩转 Spring Boot 入门篇 玩转 Spring Boot 集成篇(mysql、Druid、HikariCP) 玩转 Spring Boot 集成篇(MyBatis、JPA、事务支持) 玩转 Spring Boot 集成篇(Redis) 玩转 Spring Boot 集成篇(Actuator、Spring Boot Admin) 玩转 Spring Boot 集成篇(RabbitMQ) SpringApplication.run(DemoApplication.class, args);
private static final Log logger = LogFactory.getLog(DownLoadTask.class);
@Scheduled(cron = "0 0/5 * * * ?")
public void justDoIt()
logger.info("开始下载银行对账文件");
logger.info("银行对账文件下载完成,进行解密操作");
logger.info("银行对账文件下载解密完成");
private static final Log logger = LogFactory.getLog(DownLoadTask.class);
@Scheduled(cron = "0/1 * * * * ?")
public void justDoItA()
logger.info("开始下载银行 A 的对账文件");
logger.info("银行 A 对账文件下载完成,进行解密操作");
logger.info("银行 A 对账文件下载解密完成");
@Scheduled(cron = "0/1 * * * * ?")
public void justDoItB()
logger.info("开始下载银行 B 的对账文件");
logger.info("银行 B 对账文件下载完成,进行解密操作");
logger.info("银行 B 对账文件下载解密完成");
@Bean(name = "bankThreadPool")
public Executor bankExecutor()
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
// 设置核心线程数为 3
executor.setCorePoolSize(3);
// 最大线程数为10
executor.setMaxPoolSize(10);
// 任务队列的大小
executor.setQueueCapacity(3);
// 线程前缀名
executor.setThreadNamePrefix("bankExecutor-");
// 线程存活时间
executor.setKeepAliveSeconds(30);
// 初始化
executor.initialize();
return executor;
private static final Log logger = LogFactory.getLog(DownLoadTask.class);
@Async("bankThreadPool")
@Scheduled(cron = "0/1 * * * * ?")
public void justDoIt()
logger.info("开始下载银行 A 的对账文件");
logger.info("银行 A 对账文件下载完成,进行解密操作");
logger.info("银行 A 对账文件下载解密完成");
@Async("bankThreadPool")
@Scheduled(cron = "0/1 * * * * ?")
public void justDoIt2()
logger.info("开始下载银行 B 的对账文件");
logger.info("银行 B 对账文件下载完成,进行解密操作");
logger.info("银行 B 对账文件下载解密完成");
* 动态定时任务实现步骤
* 步骤1:定义定时任务 DownLoadTaskV3 类实现 SchedulingConfigurer 接口;
* 步骤2:编写定时任务要执行的业务逻辑;
* 步骤3:数据库中配置任务执行的具体时间规则,记住任务名称
* 步骤4:根据任务名称从数据库获取 Cron 参数,设置任务触发器,触发任务执行。
* (仅抛砖引玉,可作进一步的抽象)
*/
Log logger = LogFactory.getLog(DownLoadTaskV3.class);
TaskInfoRepository taskInfoRepository;
Runnable task = Runnable()
logger.info( logger.info( logger.info(
;
Trigger trigger = Trigger()
* 每一次任务触发,都会调用一次该方法
* 然后重新获取下一次的执行时间
*/
Date
TaskInfo taskInfo = TaskInfo();
taskInfo.setJobName( Optional<TaskInfo> taskInfoOptional = taskInfoRepository.findOne(Example.of(taskInfo));
String cron = taskInfoOptional.get().getCron();
CronTrigger trigger = CronTrigger(cron);
trigger.nextExecutionTime(triggerContext);
;
taskRegistrar.addTriggerTask(task, trigger);
(
AUTO_INCREMENT datetime datetime PRIMARY ((TaskInfo Serializable
Integer id;
cron;
jobName;
status;
createTime;
updateTime;
JpaRepository<TaskInfo, Integer>
玩转Spring Boot 集成Dubbo
以上是关于玩转 Spring Boot 集成篇(@Scheduled静态动态定时任务)的主要内容,如果未能解决你的问题,请参考以下文章