• springboot 不停服动态更新定时任务时间(转)


    转 https://blog.csdn.net/u012129558/article/details/80834303

    Spring框架自3.0版本起,自带了任务调度功能,好比是一个轻量级的Quartz,而且使用起来也方便、简单,且不需要依赖其他的JAR包。秉承着Spring的一贯风格,Spring任务调度的实现同时支持注解配置和XML配置两种方式。

      再来谈谈变态的项目需求:我们正在做一个智能数字电表的数据采集项目,项目最终会在多个工业园上线,每个工业园对电表数据的采集周期可以进行自定义,例如A工业园想每10分钟采集一次数据,B工业园想每15分钟采集一次数据。因为数据采集是个重复的周期性工作,那么就可以考虑使用Spring框架的定时任务功能了。

      按正常来讲,修改定时任务的执行周期还不简单,把服务停下来,改下任务的cron参数,再重启服务就搞定了。但有没有一种可能,在不停服务的情况下,就可以动态的修改任务的cron参数呢?完全是有可能的!

      然后是注解式任务逻辑代码SpringStaticCronTask.java

    package com.pes_soft.task.demo;
     
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.context.annotation.Lazy;
    import org.springframework.scheduling.annotation.Scheduled;
    import org.springframework.stereotype.Component;
     
    /**
     * Spring静态周期定时任务
     * @Author 许亮
     * @Create 2016-11-10 16:31:29
     */
    @Lazy(false)
    @Component
    public class SpringStaticCronTask {
    	private static final Logger logger = LoggerFactory.getLogger(SpringStaticCronTask.class);
    	
    	@Scheduled(cron="0/5 * * * * ?")
    	public void staticCronTask() {
    		logger.debug("staticCronTask is running...");
    	}
    }

      

      上述任务适用于具有固定任务周期的任务,若要修改任务执行周期,只能走“停服务→修改任务执行周期→重启服务”这条路。

      下面来看看可以在不停服务的情况下动态修改任务周期的实现,步骤如下:

    1. 在定时任务类上增加@EnableScheduling注解,并实现SchedulingConfigurer接口。(值得注意的是:@EnableScheduling对Spring的版本要求比较高,一开始使用的3.2.6版本时一直未成功,后来改成4.2.5版本就可以了)
    2. 设置一个静态变量cron,用于存放任务执行周期参数。
    3. 另辟一线程,用于模拟实际业务中外部原因修改了任务执行周期。
    4. 设置任务触发器,触发任务执行,其中就可以修改任务的执行周期。

      完整的SpringDynamicCronTask.java代码如下  将demo运行起来,查看任务执行情况,可以观察到任务的执行周期由5秒变成了10秒,期间服务并未停止。

    package com.pes_soft.task.demo;
     
    import java.util.Date;
     
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.context.annotation.Lazy;
    import org.springframework.scheduling.Trigger;
    import org.springframework.scheduling.TriggerContext;
    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 org.springframework.stereotype.Component;
     
    /**
     * Spring动态周期定时任务<br>
     * 在不停应用的情况下更改任务执行周期
     * @Author 许亮
     * @Create 2016-11-10 16:31:29
     */
    @Lazy(false)
    @Component
    @EnableScheduling
    public class SpringDynamicCronTask implements SchedulingConfigurer {
    	private static final Logger logger = LoggerFactory.getLogger(SpringDynamicCronTask.class);
    	
    	private static String cron;
    	
    	public SpringDynamicCronTask() {
    		cron = "0/5 * * * * ?";
    		
    		// 开启新线程模拟外部更改了任务执行周期
    		new Thread(new Runnable() {
    			@Override
    			public void run() {
    				try {
    					Thread.sleep(15 * 1000);
    				} catch (InterruptedException e) {
    					e.printStackTrace();
    				}
    				
    				cron = "0/10 * * * * ?";
    				System.err.println("cron change to: " + cron);
    			}
    		}).start();
    	}
     
    	@Override
    	public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
    		taskRegistrar.addTriggerTask(new Runnable() {
    			@Override
    			public void run() {
    				// 任务逻辑
    				logger.debug("dynamicCronTask is running...");
    			}
    		}, new Trigger() {
    			@Override
    			public Date nextExecutionTime(TriggerContext triggerContext) {
    				// 任务触发,可修改任务的执行周期
    				CronTrigger trigger = new CronTrigger(cron);
                    Date nextExec = trigger.nextExecutionTime(triggerContext);
                    return nextExec;
    			}
    		});
    	}
    }
    

      

    
    

      

  • 相关阅读:
    再说LZ77压缩算法
    关于LZ77压缩算法
    Qt 简易设置透明按钮
    MFC edit 控件 自动将光标置于想要输入内容的位置
    事件和委托
    2016/06/07
    2016/04/28
    2016/4/27
    2016/04/26
    重载和重写(Overload, Override)
  • 原文地址:https://www.cnblogs.com/luoluoshidafu/p/11242693.html
Copyright © 2020-2023  润新知