需求缘起:在发布了《Spring Boot定时任务升级篇》之后得到不少反馈,其中有一个反馈就是如何动态修改cron参数呢?那么我们一起看看具体怎么实现,先看下本节大纲:

()简单方式:修改定时任务的执行周期;
()动态修改定时任务的执行周期;

接下来看下本节的具体内容:

(1)简单方式:修改定时任务的执行周期;

按正常来讲,修改定时任务的执行周期,把服务停下来,改下任务的cron参数,再重启服务就搞搞定了。这种方式很简单,没有可说的,但是有没有一种可能,在不停服务的情况下,就可以动态的修改任务的cron参数呢?哈哈,那是必须的必。

(2)动态修改定时任务的执行周期;

首先我们先会回顾下,我们之前是使用了@Scheduled(cron =“0/5 * * * * *”)这种方式适用于固定任务周期的任务,若要修改任务执行周期,只能走“停服务—修改任务执行周期—重启服务”这条路。

那么如何动态修改呢,我们看下步骤:

① 在定时任务类上增加@EnabledScheduling注解,并实现SchedulingConfigurer接口。
② 设置一个静态的cron,用于存放任务执行周期参数。
③ 开启一个线程,用于模拟实际业务中外部原因修改了任务执行周期。
④ 设置任务触发器,触发任务执行。

具体的代码如下:

package com.kfit.task;

import java.util.Date; 

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 @Scheduled定时任务动态修改cron参数

 * @author Angel --守护天使

 * @version v.0.1

 * @date 2017年4月6日

 */

@Component 

@EnableScheduling

public class TaskCronChange implements  SchedulingConfigurer{

    public static String cron; 

    public TaskCronChange() {

        //默认情况是:每5秒执行一次.
cron = "0/5 * * * * *"; new Thread(new Runnable() { // 开启新线程模拟外部更改了任务执行周期.
@Override
public void run() {
try {
// 让线程睡眠 15秒.
Thread.sleep(15000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//修改为:每10秒执行一次.
cron = "0/10 * * * * *";
System.err.println("cron change to:"+cron);
} }).start();;
} @Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { Runnable task = new Runnable() { @Override public void run() {
//任务逻辑代码部分.
System.out.println("TaskCronChange task is running ... "+ new Date());
} }; Trigger trigger = new Trigger() { @Override
public Date nextExecutionTime(TriggerContext triggerContext) { //任务触发,可修改任务的执行周期.
CronTrigger trigger = new CronTrigger(cron);
Date nextExec = trigger.nextExecutionTime(triggerContext);
return nextExec;
}
};
taskRegistrar.addTriggerTask(task, trigger);
}
}

这里核心的主要是使用到了ScheduledTaskRegistrar这个类有一个方法addTriggerTask(Runnable,Trigger) 两个参数,一个Runnable,一个是Trigger,在Runnable中执行业务逻辑代码,在Trigger修改定时任务的执行周期。

启动查看控制台的打印信息如下:

TaskCronChange task is running ... Thu Apr 06 05:38:20 CST 2017

TaskCronChange task is running ... Thu Apr 06 05:38:25 CST 2017

TaskCronChange task is running ... Thu Apr 06 05:38:30 CST 2017

cron change to:0/10 * * * * *

TaskCronChange task is running ... Thu Apr 06 05:38:35 CST 2017

TaskCronChange task is running ... Thu Apr 06 05:38:40 CST 2017

TaskCronChange task is running ... Thu Apr 06 05:38:50 CST 2017

转自:http://412887952-qq-com.iteye.com/blog/2367537

SpringBoot 定时任务升级篇(动态修改cron参数)的更多相关文章

  1. SpringBoot定时任务升级篇(动态添加修改删除定时任务)

    需求缘起:在发布了<Spring Boot定时任务升级篇>之后得到不少反馈,其中有一个反馈就是如何动态添加修改删除定时任务?那么我们一起看看具体怎么实现,先看下本节大纲: (1)思路说明: ...

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

    在定时任务类上增加@EnableScheduling注解,并实现SchedulingConfigurer接口.(注意低版本无效) 设置一个静态变量cron,用于存放任务执行周期参数. 另辟一线程,用于 ...

  3. Springboot自带定时任务实现动态配置Cron参数

    同学们,我今天分享一下SpringBoot动态配置Cron参数.场景是这样子的:后台管理界面对定时任务进行管理,可动态修改执行时间,然后保存入库,每次任务执行前从库里查询时间,以达到动态修改Cron参 ...

  4. Spring Cloud Gateway 动态修改请求参数解决 # URL 编码错误传参问题

    Spring Cloud Gateway 动态修改请求参数解决 # URL 编码错误传参问题 继实现动态修改请求 Body 以及重试带 Body 的请求之后,我们又遇到了一个小问题.最近很多接口,收到 ...

  5. Springboot定时任务实现动态配置Cron参数(从外部数据库获取)

    https://blog.csdn.net/qq_35992900/article/details/80429245 我们主要讲解它的动态配置使用方法. 在刚开始使用的时候,我们更改一个任务的执行时间 ...

  6. redis动态修改参数配置

    ./redis-cli -h 10.10.10.11 -p 6401   save  # 保存当前快照   # 列出所有当前配置 config get *   # 查看指定配置 config get  ...

  7. Spring Boot 系列教程14-动态修改定时任务cron参数

    动态修改定时任务cron参数 不需要重启应用就可以动态的改变Cron表达式的值 不能使用@Scheduled(cron = "${jobs.cron}")实现 DynamicSch ...

  8. 【使用篇二】SpringBoot定时任务Scheduled(14)

    在日常项目运行中,我们总会有需求在某一时间段周期性的执行某个动作.比如每天在某个时间段导出报表,或者每隔多久统计一次现在在线的用户量.在springboot中可以有很多方案去帮我们完成定时器的工作,有 ...

  9. SpringBoot第十七篇:定时任务

    作者:追梦1819 原文:https://www.cnblogs.com/yanfei1819/p/11076555.html 版权声明:本文为博主原创文章,转载请附上博文链接! 引言   相信大家对 ...

随机推荐

  1. MSP430 G2553 寄存器列表与引脚功能

    USCI_B0 USCI_B0 发送缓冲器UCB0TXBUF 06Fh USCI_B0 接收缓冲器UCB0RXBUF 06Eh USCI_B0 状态UCB0STAT 06Dh USCI B0 I2C ...

  2. Day 32 process&threading_4

    线程和进程 4 一.multiprocessing模块 multiprocessing包是Python中的多进程管理包. 与threading.Thread类似,它可以利用multiprocessin ...

  3. Day 30 process&thread_2

    进程和线程_2 1.继承类创建线程 import threading,time class Mythread(threading.Thread): #建立类,继承threading.Thread de ...

  4. 【转载】Outlook2010 移动数据文件到其它地方

            您可以将数据文件移到计算机的其他文件夹中.移动文件的一个原因在于可使备份更容易并且可以让默认的outlook邮件文件不在存在C盘,导致装系统不见或者文件过大而撑死了C盘.例如,如果数据 ...

  5. iOS直播Liveroom组件,游客,用户多次切换登录同一直播间,消息出现多次重复问题解决

    byzqk 新版,加入连麦功能,直播的流程修改很多,每次登录都需要登录liveroom组件 期间遇到一个奇葩的问题,就是游客登录组件之后,切换为用户登录,出现im消息重复的问题,一开始以为是游客退出不 ...

  6. NWU现场赛——解题报告

    负二进制转换 Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other) Problem Desc ...

  7. Java---杨辉三角简易解法(通俗易懂,逻辑严密)

  8. Data-structures-and-algorithms-interview-questions-and-their-solutions

    https://techiedelight.quora.com/500-Data-structures-and-algorithms-interview-questions-and-their-sol ...

  9. mysql之group by,order by

    写在前面 上篇文章介绍mysql的增删改查操作,这篇将介绍group和order by操作. 系列文章 mysql之创建数据库,创建数据表 mysql之select,insert,delete,upd ...

  10. cocos3.x新建项目

    cocos new -p FishRunMan com.game.simple -l cpp