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;
			}
		});
	}
}

  


  

原文地址:https://www.cnblogs.com/luoluoshidafu/p/11242693.html

时间: 2024-08-29 07:32:16

springboot 不停服动态更新定时任务时间(转)的相关文章

JAVA代码热部署,在线不停服动态更新

本地debug的时候,可以实时编译并更新代码,线上也可以不停服来动态更新类,即所说的java热部署. JDK代理的两种方式: 1.premain方式是Java SE5开始就提供的代理方式,但其必须在命令行指定代理jar,并且代理类必须在main方法前启动,它要求开发者在应用启动前就必须确认代理的处理逻辑和参数内容等等 2.agentmain方式是JavaSE6开始提供,它可以在应用程序的VM启动后再动态添加代理的方式 agentmain应用场景: 比如正常的生产环境下,一般不会开启代理功能,但是

springboot整合Quartz实现动态配置定时任务

前言 在我们日常的开发中,很多时候,定时任务都不是写死的,而是写到数据库中,从而实现定时任务的动态配置,下面就通过一个简单的示例,来实现这个功能. 一.新建一个springboot工程,并添加依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency>

SpringBoot集成Quartz动态定时任务

项目中需要用到定时任务,考虑了下java方面定时任务无非就三种: 用Java自带的timer类.稍微看了一下,可以实现大部分的指定频率的任务的调度(timer.schedule()),也可以实现关闭和开启(timer.cancle).但是用其来实现某天的某个时间或者某月的某一天调度任务有点不方便. 采用Quartz 调度器实现.这是一个功能很强大的开源的专门用于定时任务调度的框架,也很好的和springboot整合,缺点:配置复杂,需要花费一定的时间去了解和研究. spring3.0以后自带的s

不停服更新二进制文件

原文 http://www.zhaoch.top/操作系统/linux/不停服更新二进制文件.html 不停服更新二进制文件 www.zhaoch.top > 操作系统 > linux 虽然目前分布式架构和keepalived等工具的存在,对于某些特殊的程序,仍然需要不停服更新二进制文件. 这里参考nginx的实现介绍下如何实现这个功能的 痛点 已有的链接不中断,直至这个客户端完成业务处理 使用新的程序文件处理新的请求 新老进程同时存在还要监听相同的端口 思路 因为要监听相同端口所以一般都是父

Springboot定时任务原理及如何动态创建定时任务

一.前言 上周工作遇到了一个需求,同步多个省份销号数据,解绑微信粉丝.分省定时将销号数据放到SFTP服务器上,我需要开发定时任务去解析文件.因为是多省份,服务器.文件名规则.数据规则都不一定,所以要做成可配置是有一定难度的.数据规则这块必须强烈要求统一,服务器.文件名规则都可以从配置中心去读.每新增一个省份的配置,后台感知到后,动态生成定时任务. 二.Springboot引入定时任务核心配置 @Target(ElementType.TYPE) @Retention(RetentionPolicy

动态更新语句,时间精度丢失

原文:动态更新语句,时间精度丢失 昨天在程序中,有想到动态的SQL语句中,去做时间更新,更新后的结果,发觉时间的精度丢失了.程序这样子, 执行结果: 上面的程序,是把时间转默认字符串,字符串再存入datetime字段中,在转换时丢失了.解决这个问题,Insus.NET使用了转换函数:http://www.cnblogs.com/insus/archive/2011/02/12/1952753.htmlhttp://www.cnblogs.com/insus/articles/1554836.ht

Js多国时间动态更新

Js多国时间动态更新 点击下载

应用canvas绘制动态时钟--每秒自动动态更新时间

使用canvas绘制时钟 下文是部分代码,完整代码参照:https://github.com/lemoncool/canvas-clock,可直接下载. 首先看一下效果图:每隔一秒会动态更新时间 一.前期准备 1. HTML中准备一个容器存放画布,并为其设置width,height. <div> <canvas id="clock" height="200px" width="200px"></canvas>

跨园区容灾,升级不停服——高可用负载均衡集群实践

对于云计算行业来说,云服务的可用性和可扩展性是的检测其服务质量的重要标准,也是最受用户关注的两大难题.各云计算厂商针对容灾.升级等需求的解决方案,最能够体现其底层架构的实力.腾讯云基于基础架构的优势,为分期乐.微信红包等平台提供技术支持,可以完美满足如下三点需求: 1. 高可用能力,容灾能力强,升级不停服 2. 可扩展性强,功能丰富,性能超高 3. 避免重复造轮子,性价比之王 近期,针对一些客户对腾讯云产品可用性的问询,腾讯云基础产品团队对负载均衡产品的原理做出详细阐述,并希望通过对腾讯负载均衡