(1)思路说明;

(a)首先这里我们需要重新认识一个类ThreadPoolTaskScheduler:线程池任务调度类,能够开启线程池进行任务调度。

(b)ThreadPoolTaskScheduler.schedule()方法会创建一个定时计划ScheduledFuture,在这个方法需要添加两个参数,Runnable(线程接口类) 和CronTrigger(定时任务触发器)

(c)在ScheduledFuture中有一个cancel可以停止定时任务。

(2)代码解析;

根据以上的思路分析,我们很容易就知道如何进行编码了,先提供代码如下:

package com.kfit.task;import java.util.Date;
import java.util.concurrent.ScheduledFuture;
import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; /*** @author Angel --守护天使* @version v.0.1* @date 2017年4月6日*/@RestController
@Component
public class DynamicTask { @Autowiredprivate ThreadPoolTaskScheduler threadPoolTaskScheduler; private ScheduledFuture<?> future; @Beanpublic ThreadPoolTaskScheduler threadPoolTaskScheduler() {return new ThreadPoolTaskScheduler();} @RequestMapping("/startCron")public String startCron() {if(null == future || future.isCancelled()){//判断第一次开启和避免重复开启产生多条线程future = threadPoolTaskScheduler.schedule(new MyRunnable(), new CronTrigger("0/5 * * * * *"));System.out.println("DynamicTask.startCron()");    }return "startCron";} @RequestMapping("/stopCron")public String stopCron() {if (future != null && !future.isCancelled()) {future.cancel(true);}System.out.println("DynamicTask.stopCron()");return "stopCron";}@RequestMapping("/changeCron10")public String startCron10() {stopCron();// 先停止,在开启.future = threadPoolTaskScheduler.schedule(new MyRunnable(), new CronTrigger("*/10 * * * * *"));System.out.println("DynamicTask.startCron10()");return "changeCron10";}private class MyRunnable implements Runnable {@Overridepublic void run() {System.out.println("DynamicTask.MyRunnable.run()," + new Date());}}
}

小结:
(a)我们首先了一个类DynamicTask;
(b)定义了两个变量,threadPoolTaskScheduler和future 其中future是treadPoolTaskScheduler执行方法schedule的返回值,主要用于定时任务的停止。
(c)编写启动定时器的方法startCron();
(d)编写停止方法stopCron(),这里编码的时候,需要注意下需要判断下future为null的时候,不然就很容易抛出NullPointerException;
(e)编写修改定时任务执行周期方法changeCron10(),这里的原理就是关闭之前的定时器,创新在创建一个新的定时器。

(3)修改定时任务执行周期特别说明;

在上一篇博客中,我们使用了一种方式通过全局变量的方式修改cron参数的值,那么在这里的我们也是可以这么做的,这里简单提供下思路,大家自己去实现。

注意ThreadPoolTaskScheduler中的schedule()第二个参数支持Trigger:

ThreadPoolTaskScheduler.schedule(Runnable arg0, Trigger arg1)

那么我们就可以自己定义一个Trigger,然后动态进行修改了,这里提供核心的代码如下:

private String cronStr = "*/5 * * * * *";@RequestMapping("/startCron1")public String startCron1(){System.out.println("startCron1 >>>>");threadPoolTaskScheduler.schedule(new MyRunnable(), new Trigger(){@Overridepublic Date nextExecutionTime(TriggerContext triggerContext){returnnew CronTrigger(cronStr).nextExecutionTime(triggerContext);}});System.out.println("startCron1 <<<<");return "startCron1";}

原文出处:

腾逸, SpringBoot定时任务升级篇(动态添加修改删除定时任务), https://www.cnblogs.com/zt007/p/8954096.html

转载于:https://www.cnblogs.com/ryelqy/p/10256266.html

SpringBoot定时任务升级篇(动态添加修改删除定时任务)相关推荐

  1. 如何动态添加修改删除定时任务

    如何动态添加修改删除定时任务 (1)思路说明: (a)首先这里我们需要重新认识一个类ThreadPoolTaskScheduler:线程池任务调度类,能够开启线程池进行任务调度. (b)ThreadP ...

  2. js动态添加修改删除元素

    事件委托:e.target 核心:1.通过事件冒泡给子元素添加事件,控制新生成的元素进行操作 2.减少DOM元素操作,只需要绑定一个父元素就可以,不用循环遍历每一个子元素进行绑定事件操作,提高程序性能 ...

  3. html表格中添加修改和删除链接,jQuery实现为table表格动态添加或删除tr功能示例...

    本文实例讲述了jQuery实现为table表格动态添加或删除tr功能.分享给大家供大家参考,具体如下: HTML页面元素如下: 订单合同号 捆包号 品名 规格 材质 重量 业务需求是,从后台获取到订单 ...

  4. JavaScript 高级篇之DOM文档,简单封装及调用、动态添加、删除样式(推荐七)

    前言 学习是有趣的,但有过滤的学习内容就更好,本博主就专门为刚接触javascript客户端编程的朋友提供及分享个人学习经历!建议大家看看:(汤姆大叔的博客) http://www.cnblogs.c ...

  5. CentOS7设置静态IP、搭建单机版FastDFS图片服务器、使用FastDFS-Client客户端进行简单测试、实现图片上传、实现商品添加修改删除

    CentOS7设置静态IP.搭建单机版FastDFS图片服务器.使用FastDFS-Client客户端进行简单测试.实现图片上传.实现商品添加修改删除 CentOS7设置静态IP而且还可以上网 192 ...

  6. 动态添加和删除 ListView 项

    https://docs.microsoft.com/zh-cn/learn/modules/display-collections-in-xamarin-forms-apps-with-listvi ...

  7. Unity NGUI中动态添加和删除sprite

    (以后,参考链接和作者将在文章首部给出,转载请保留此部分内容) 参考链接:http://www.narkii.com/club/thread-299977-1.html,作者:纳金网 比巴卜: 参考链 ...

  8. JS实现动态添加和删除div

    实现方式一:只在最后一个数据中动态添加或者删除 | 背景 需要做一个页面,页面可以输入参数,点击确认按钮可以发请求给某接口.但是接口的某个字段是数组类型,所以在页面上需要实现添加或者删除元素的功能. ...

  9. Unity NGUI中动态添加和删除sprite(附上转载者注释)

    --------------------- 此部分为转载的感受. 原文对于NGUI如何动态添加删除sprite,以及调用NGUI中的图集Atlas都有很明确的代码. 转载括号内容附上转载作者(Bula ...

最新文章

  1. 解读金山网盾3.5 0day漏洞免疫技术
  2. asp.net 中的错误处理
  3. python将变量i的值增加1_Python中变量自增、i+=x与i=i+x、is与==
  4. 98. Validate Binary Search Tree
  5. python while一定要提供循环次数吗_Python语法之选择和循环(if、while)
  6. Android添加单元测试的方法与步骤
  7. discuz加密解密,可参考下
  8. 网页无障碍php,【译】开发无障碍的Web组件
  9. python爬取小说基本信息_Python爬虫零基础实例---爬取小说吧小说内容到本地
  10. Nginx的反向代理的配置
  11. 计算机日常英语,计算机英语的常用句子
  12. 线程相关函数(1)-pthread_create(), pthread_join(), pthread_exit(), pthread_cancel() 创建取消线程
  13. 如何在 Linux 中运行.exe 程序
  14. html终止函数运行,js 终止执行的实现方法
  15. win10计算机 回收站等怎么放桌面,WIN10如何在桌面删除回收站_win10电脑怎么删除回收站图标-win7之家...
  16. YOLOv5损失函数定义
  17. matlab矩阵里面星号,矩阵中出现加号和星号 什么意思
  18. 摆脱“咖喱味”,让Win11的右键菜单回归经典
  19. 单片机电流检测电路图大全(四款模拟电路设计原理图详解) - 信号处理电子电路图
  20. matlab 强度梯度,梯度算法的Matlab实现

热门文章

  1. Vision Transformer论文精读(1/2)
  2. iphone最牛判断当前手机网络连接类型wifi-2G-3G-4G-5G
  3. 使用小企鹅五笔单字输入模式
  4. 【4】WiFi——————ESP8266 SDK编程 之 UDP通信
  5. 代码整洁之道精华——序言
  6. 我们的心情,你能体会吗,Ms. Phoebe?
  7. 为信仰充值——GoogleDeveloperDay
  8. 实验五 连接查询和嵌套查询
  9. 输入一个整数作为随机函数种子,随机生成5个不同的长度为10的激活码。
  10. 计算机x线平扫对人健康有影响吗,医院放射线检查会影响身体?