本篇文章小编给大家分享一下Spring动态添加定时任务代码实现示例,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看。
一、背景
在工作中,有些时候我们有些定时任务的执行可能是需要动态修改的,比如:生成报表,有些项目配置每天的8点生成,有些项目配置每天的10点生成,像这种动态的任务执行时间,在不考虑分布式执行的情况下,我们可以 使用Spring Task来简单的实现。
二、需求和实现思路
1、能够动态的添加一个定时任务。
在Spring中存在一个类ThreadPoolTaskScheduler,它可以实现根据一个cron表达式来调度一个任务,并返回一个ScheduledFuture对象。
2、能够取消定时任务的执行。
通过调用上一步的ScheduledFuture的cancel方法,就可以将这个任务取消。
3、动态的修改任务执行的时间。
先取消任务。然后在重新注册一个任务。
4、获取定时任务执行的异常
ThreadPoolTaskScheduler类中有一个设置ErrorHandler的方法,给自己实现的ErrorHandler即可。
提示:
在Spring中我们通过@Scheduled注解来实现的定时任务,底层也是通过ThreadPoolTaskScheduler来实现的。可以通过ScheduledAnnotationBeanPostProcessor类来查看。
ThreadPoolTaskScheduler的默认线程数是1,这个需要根据实际的情况进行修改。
三、代码实现
此处只给出动态注册定时任务和取消的定时任务的代码。
package com.huan.study.task.jobs.tasks; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; import org.springframework.scheduling.support.CronExpression; import org.springframework.scheduling.support.CronTrigger; import org.springframework.stereotype.Component; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; /** * @author huan.fu 2021/7/8 - 下午2:46 */ @Component @Slf4j public class DynamicCronTask implements InitializingBean { @Autowired private ThreadPoolTaskScheduler taskScheduler; private ScheduledFuture> scheduledFuture; @Override public void afterPropertiesSet() throws Exception { // 动态启动一个定时任务 log.info("注册一个定时任务:每隔1秒执行一次"); scheduledFuture = register("* * * * * ?"); // 取消一个调度 new Thread(() -> { try { TimeUnit.SECONDS.sleep(5); log.info("取消调度"); scheduledFuture.cancel(false); log.info("取消结果:" + scheduledFuture.isCancelled()); log.info("重新注册一个定时任务:每隔2秒执行一次"); register("*/2 * * * * ?"); } catch (InterruptedException e) { e.printStackTrace(); } }).start(); } private ScheduledFuture> register(String cron) { // 高版本使用 CronExpression,低版本使用 CronSequenceGenerator boolean validExpression = CronExpression.isValidExpression(cron); log.info("cron:[{}]是合法的吗:[{}]", cron, validExpression); CronExpression expression = CronExpression.parse(cron); LocalDateTime nextExecTime = expression.next(LocalDateTime.now()); if (null != nextExecTime) { log.info("定时任务下次执行的时间为:[{}]", nextExecTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); } return taskScheduler.schedule(new Runnable() { @Override public void run() { log.info("我执行了"); } }, new CronTrigger(cron)); } }
四、
忍者必须死34399账号登录版 最新版v1.0.138v2.0.72
下载勇者秘境oppo版 安卓版v1.0.5
下载忍者必须死3一加版 最新版v1.0.138v2.0.72
下载绝世仙王官方正版 最新安卓版v1.0.49
下载Goat Simulator 3手机版 安卓版v1.0.8.2
Goat Simulator 3手机版是一个非常有趣的模拟游
Goat Simulator 3国际服 安卓版v1.0.8.2
Goat Simulator 3国际版是一个非常有趣的山羊模
烟花燃放模拟器中文版 2025最新版v1.0
烟花燃放模拟器是款仿真的烟花绽放模拟器类型单机小游戏,全方位
我的世界动漫世界 手机版v友y整合
我的世界动漫世界模组整合包是一款加入了动漫元素的素材整合包,
我的世界贝爷生存整合包 最新版v隔壁老王
我的世界MITE贝爷生存整合包是一款根据原版MC制作的魔改整