Spring@Scheduled定时任务动态修改cron参数

Spring@Scheduled定时任务动态修改cron参数

2023年7月21日发(作者:)

Spring@Scheduled定时任务动态修改cron参数  Spring框架⾃3.0版本起,⾃带了任务调度功能,好⽐是⼀个轻量级的Quartz,⽽且使⽤起来也⽅便、简单,且不需要依赖其他的JAR包。秉承着Spring的⼀贯风格,Spring任务调度的实现同时⽀持注解配置和XML配置两种⽅式。  再来谈谈变态的项⽬需求:我们正在做⼀个智能数字电表的数据采集项⽬,项⽬最终会在多个⼯业园上线,每个⼯业园对电表数据的采集周期可以进⾏⾃定义,例如A⼯业园想每10分钟采集⼀次数据,B⼯业园想每15分钟采集⼀次数据。因为数据采集是个重复的周期性⼯作,那么就可以考虑使⽤Spring框架的定时任务功能了。  按正常来讲,修改定时任务的执⾏周期还不简单,把服务停下来,改下任务的cron参数,再重启服务就搞定了。但有没有⼀种可能,在不停服务的情况下,就可以动态的修改任务的cron参数呢?完全是有可能的!  先来看下Spring常规定时任务的配置,如下:

  然后是注解式任务逻辑代码ckage _;import ;import Factory;import ;import led;import ent;/** * Spring静态周期定时任务 * @Author 许亮 * @Create 2016-11-10 16:31:29 */@Lazy(false)@Componentpublic class SpringStaticCronTask { private static final Logger logger = ger();

@Scheduled(cron="0/5 * * * * ?") public void staticCronTask() { ("staticCronTask "); }

}  上述任务适⽤于具有固定任务周期的任务,若要修改任务执⾏周期,只能⾛“停服务→修改任务执⾏周期→重启服务”这条路。  下⾯来看看可以在不停服务的情况下动态修改任务周期的实现,步骤如下:1. 在定时任务类上增加@EnableScheduling注解,并实现SchedulingConfigurer接⼝。(值得注意的是:@EnableScheduling对Spring的版本要求⽐较⾼,⼀开始使⽤的3.2.6版本时⼀直未成功,后来改成4.2.5版本就可以了)2. 设置⼀个静态变量cron,⽤于存放任务执⾏周期参数。3. 另辟⼀线程,⽤于模拟实际业务中外部原因修改了任务执⾏周期。4. 设置任务触发器,触发任务执⾏,其中就可以修改任务的执⾏周期。  完整的代码如下:package _;import ;import ;import Factory;import ;import r;import rContext;import Scheduling;import lingConfigurer;import ledTaskRegistrar;import igger;import ent;/** * Spring动态周期定时任务

* 在不停应⽤的情况下更改任务执⾏周期 * @Author 许亮 * @Create 2016-11-10 16:31:29 */@Lazy(false)@Component@EnableSchedulingpublic class SpringDynamicCronTask implements SchedulingConfigurer { private static final Logger logger = ger();

private static String cron;

public SpringDynamicCronTask() { cron = "0/5 * * * * ?";

// 开启新线程模拟外部更改了任务执⾏周期 new Thread(new Runnable() { @Override public void run() { try { (15 * 1000); } catch (InterruptedException e) { tackTrace(); }

cron = "0/10 * * * * ?"; n("cron change to: " + cron); } }).start(); } @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { ggerTask(new Runnable() { @Override public void run() { public void run() { // 任务逻辑 ("dynamicCronTask "); } }, new Trigger() { @Override public Date nextExecutionTime(TriggerContext triggerContext) { // 任务触发,可修改任务的执⾏周期 CronTrigger trigger = new CronTrigger(cron); Date nextExec = ecutionTime(triggerContext); return nextExec; } }); }}  将demo运⾏起来,查看任务执⾏情况,可以观察到任务的执⾏周期由5秒变成了10秒,期间服务并未停⽌。    源码下载:

发布者:admin,转转请注明出处:http://www.yc00.com/web/1689929791a295198.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信