转 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

  1. package com.pes_soft.task.demo;
  2.  
  3. import org.slf4j.Logger;
  4. import org.slf4j.LoggerFactory;
  5. import org.springframework.context.annotation.Lazy;
  6. import org.springframework.scheduling.annotation.Scheduled;
  7. import org.springframework.stereotype.Component;
  8.  
  9. /**
  10. * Spring静态周期定时任务
  11. * @Author 许亮
  12. * @Create 2016-11-10 16:31:29
  13. */
  14. @Lazy(false)
  15. @Component
  16. public class SpringStaticCronTask {
  17. private static final Logger logger = LoggerFactory.getLogger(SpringStaticCronTask.class);
  18.  
  19. @Scheduled(cron="0/5 * * * * ?")
  20. public void staticCronTask() {
  21. logger.debug("staticCronTask is running...");
  22. }
  23. }

  

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

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

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

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

  1. package com.pes_soft.task.demo;
  2.  
  3. import java.util.Date;
  4.  
  5. import org.slf4j.Logger;
  6. import org.slf4j.LoggerFactory;
  7. import org.springframework.context.annotation.Lazy;
  8. import org.springframework.scheduling.Trigger;
  9. import org.springframework.scheduling.TriggerContext;
  10. import org.springframework.scheduling.annotation.EnableScheduling;
  11. import org.springframework.scheduling.annotation.SchedulingConfigurer;
  12. import org.springframework.scheduling.config.ScheduledTaskRegistrar;
  13. import org.springframework.scheduling.support.CronTrigger;
  14. import org.springframework.stereotype.Component;
  15.  
  16. /**
  17. * Spring动态周期定时任务<br>
  18. * 在不停应用的情况下更改任务执行周期
  19. * @Author 许亮
  20. * @Create 2016-11-10 16:31:29
  21. */
  22. @Lazy(false)
  23. @Component
  24. @EnableScheduling
  25. public class SpringDynamicCronTask implements SchedulingConfigurer {
  26. private static final Logger logger = LoggerFactory.getLogger(SpringDynamicCronTask.class);
  27.  
  28. private static String cron;
  29.  
  30. public SpringDynamicCronTask() {
  31. cron = "0/5 * * * * ?";
  32.  
  33. // 开启新线程模拟外部更改了任务执行周期
  34. new Thread(new Runnable() {
  35. @Override
  36. public void run() {
  37. try {
  38. Thread.sleep(15 * 1000);
  39. } catch (InterruptedException e) {
  40. e.printStackTrace();
  41. }
  42.  
  43. cron = "0/10 * * * * ?";
  44. System.err.println("cron change to: " + cron);
  45. }
  46. }).start();
  47. }
  48.  
  49. @Override
  50. public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
  51. taskRegistrar.addTriggerTask(new Runnable() {
  52. @Override
  53. public void run() {
  54. // 任务逻辑
  55. logger.debug("dynamicCronTask is running...");
  56. }
  57. }, new Trigger() {
  58. @Override
  59. public Date nextExecutionTime(TriggerContext triggerContext) {
  60. // 任务触发,可修改任务的执行周期
  61. CronTrigger trigger = new CronTrigger(cron);
  62. Date nextExec = trigger.nextExecutionTime(triggerContext);
  63. return nextExec;
  64. }
  65. });
  66. }
  67. }

  

  1.  

  

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

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

    本地debug的时候,可以实时编译并更新代码,线上也可以不停服来动态更新类,即所说的java热部署.   JDK代理的两种方式: 1.premain方式是Java SE5开始就提供的代理方式,但其必须 ...

  2. SpringBoot2.0整合Quartz实现动态设置定时任务时间

    一.    引入依赖 <!-- 引入quartz依赖 --> <dependency> <groupId>org.springframework.boot</ ...

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

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

  4. springBoot集成 quartz动态定时任务

    项目中需要用到定时任务,考虑了下java方面定时任务无非就三种: 用Java自带的timer类.稍微看了一下,可以实现大部分的指定频率的任务的调度(timer.schedule()),也可以实现关闭和 ...

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

    一.前言 上周工作遇到了一个需求,同步多个省份销号数据,解绑微信粉丝.分省定时将销号数据放到SFTP服务器上,我需要开发定时任务去解析文件.因为是多省份,服务器.文件名规则.数据规则都不一定,所以要做 ...

  6. Js多国时间动态更新

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

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

    使用canvas绘制时钟 下文是部分代码,完整代码参照:https://github.com/lemoncool/canvas-clock,可直接下载. 首先看一下效果图:每隔一秒会动态更新时间 一. ...

  8. Nginx进阶-不停服更新

    前言 7*24小时不间断的提供对外服务和产品快速迭代是互联网行业的特征,基于需求所有的发布都不能停止当前对外的服务.本文围绕此话题衍生出,不停服上下线工具实现. 看本文前请先看 Nginx初识 Ten ...

  9. Quartz动态添加定时任务执行sql(服务启动添加+手动添加)

    系统用来每天插入视图数据... 一.数据库表设计 1.接口配置表(t_m_db_interface_config) 2.接口日志表(t_m_db_interface_log) 3.前端配置页面 查询页 ...

随机推荐

  1. 清华大学慕课 (mooc) 数据结构-邓俊辉-讲义-合并版

    邓公的数据结构一直好评如潮,可惜我如今才开始学习它.QAQ 昨天,<数据结构 (2020 春)>的讲义已经推到清华大学云盘上了.苦于 10 拼页的打印版不易在 PC 上阅读(手机上更是如此 ...

  2. EntityFramework 插入自增ID主从表数据

    原因: 数据库中的两个表是主从表关系,但是没有建外键,而表的id用的是数据库的自增整数,导致在使用EF导入主从表数据时,需要先保存主表数据,取到 主表的自增id后才能插入从表数据,这样循环之下,数据插 ...

  3. mac停靠栏动画

    MAC停靠栏 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <ti ...

  4. JS高级---构造函数通过原型添加方法,原型的作用: 共享数据, 节省内存空间

    JS高级---构造函数,通过原型添加方法,原型的作用: 共享数据, 节省内存空间 构造函数 //构造函数 function Person(sex, age) { this.sex = sex; thi ...

  5. 红帽RHCE培训-课程2笔记目录

    目录 1 kickstart自动安装 DHCP+TFTP(syslinux) +FTP +KICKSTART ~/anaconda-ks.cfg system-config-kickstart 2 g ...

  6. layui数据表格固定头部和第一列、colspan合并列

    刚看到原型图的时候,纳尼?不是跟我开玩笑吧,小女子资历尚浅,还真没做过像这样的功能,然后就是各种找度娘,可是都没有找到合适的,很多都是行合并,真的是头疼呀!再纠结是用VUE实现还是用layui实现好, ...

  7. Apache Thrift Learning Notes

    简介 Apache Thrift软件框架(用于可扩展的跨语言服务开发)将软件堆栈与代码生成引擎结合在一起,以构建可在C ++,Java,Python,PHP,Ruby,Erlang,Perl,Hask ...

  8. TD tree体验

    在体验了学长们设计的app后,我颇有感触,我们也可以凭借自己的力量来开发一款软件,虽然它可能并不如市面上相同类型的那么完美,但它对我们的意义却是不一样的. 我是在下午的见面会上看到的这款软件,接待的学 ...

  9. 一个Log-Tan积分

    \[\Large\int_{0}^{\pi }\theta \ln\tan\frac{\theta }{2}\mathrm{d}\theta \] \(\Large\mathbf{Solution:} ...

  10. 【C语言】创建一个函数,将输入的2个数排序

    #include <stdio.h> void fun(int *x,int*y) { int t; if(*x>=*y) { t=*x;*x=*y;*y=t; } } main() ...