QuartzManager.Java 动态添加、修改和删除定时任务管理类

  1. import org.quartz.CronScheduleBuilder;
  2. import org.quartz.CronTrigger;
  3. import org.quartz.Job;
  4. import org.quartz.JobBuilder;
  5. import org.quartz.JobDetail;
  6. import org.quartz.JobKey;
  7. import org.quartz.Scheduler;
  8. import org.quartz.SchedulerFactory;
  9. import org.quartz.Trigger;
  10. import org.quartz.TriggerBuilder;
  11. import org.quartz.TriggerKey;
  12. import org.quartz.impl.StdSchedulerFactory;
  13.  
  14. public class QuartzManager {
  15.  
  16. private static SchedulerFactory schedulerFactory = new StdSchedulerFactory();
  17.  
  18. /**
  19. * @Description: 添加一个定时任务
  20. *
  21. * @param jobName 任务名
  22. * @param jobGroupName 任务组名
  23. * @param triggerName 触发器名
  24. * @param triggerGroupName 触发器组名
  25. * @param jobClass 任务
  26. * @param cron 时间设置,参考quartz说明文档
  27. */
  28. @SuppressWarnings({ "unchecked", "rawtypes" })
  29. public static void addJob(String jobName, String jobGroupName,
  30. String triggerName, String triggerGroupName, Class jobClass, String cron) {
  31. try {
  32. Scheduler sched = schedulerFactory.getScheduler();
  33. // 任务名,任务组,任务执行类
  34. JobDetail jobDetail= JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroupName).build();
  35.  
  36. // 触发器
  37. TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();
  38. // 触发器名,触发器组
  39. triggerBuilder.withIdentity(triggerName, triggerGroupName);
  40. triggerBuilder.startNow();
  41. // 触发器时间设定
  42. triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cron));
  43. // 创建Trigger对象
  44. CronTrigger trigger = (CronTrigger) triggerBuilder.build();
  45.  
  46. // 调度容器设置JobDetail和Trigger
  47. sched.scheduleJob(jobDetail, trigger);
  48.  
  49. // 启动
  50. if (!sched.isShutdown()) {
  51. sched.start();
  52. }
  53. } catch (Exception e) {
  54. throw new RuntimeException(e);
  55. }
  56. }
  57.  
  58. /**
  59. * @Description: 修改一个任务的触发时间
  60. *
  61. * @param jobName
  62. * @param jobGroupName
  63. * @param triggerName 触发器名
  64. * @param triggerGroupName 触发器组名
  65. * @param cron 时间设置,参考quartz说明文档
  66. */
  67. public static void modifyJobTime(String jobName,
  68. String jobGroupName, String triggerName, String triggerGroupName, String cron) {
  69. try {
  70. Scheduler sched = schedulerFactory.getScheduler();
  71. TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName);
  72. CronTrigger trigger = (CronTrigger) sched.getTrigger(triggerKey);
  73. if (trigger == null) {
  74. return;
  75. }
  76.  
  77. String oldTime = trigger.getCronExpression();
  78. if (!oldTime.equalsIgnoreCase(cron)) {
  79. /** 方式一 :调用 rescheduleJob 开始 */
  80. // 触发器
  81. TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();
  82. // 触发器名,触发器组
  83. triggerBuilder.withIdentity(triggerName, triggerGroupName);
  84. triggerBuilder.startNow();
  85. // 触发器时间设定
  86. triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cron));
  87. // 创建Trigger对象
  88. trigger = (CronTrigger) triggerBuilder.build();
  89. // 方式一 :修改一个任务的触发时间
  90. sched.rescheduleJob(triggerKey, trigger);
  91. /** 方式一 :调用 rescheduleJob 结束 */
  92.  
  93. /** 方式二:先删除,然后在创建一个新的Job */
  94. //JobDetail jobDetail = sched.getJobDetail(JobKey.jobKey(jobName, jobGroupName));
  95. //Class<? extends Job> jobClass = jobDetail.getJobClass();
  96. //removeJob(jobName, jobGroupName, triggerName, triggerGroupName);
  97. //addJob(jobName, jobGroupName, triggerName, triggerGroupName, jobClass, cron);
  98. /** 方式二 :先删除,然后在创建一个新的Job */
  99. }
  100. } catch (Exception e) {
  101. throw new RuntimeException(e);
  102. }
  103. }
  104.  
  105. /**
  106. * @Description: 移除一个任务
  107. *
  108. * @param jobName
  109. * @param jobGroupName
  110. * @param triggerName
  111. * @param triggerGroupName
  112. */
  113. public static void removeJob(String jobName, String jobGroupName,
  114. String triggerName, String triggerGroupName) {
  115. try {
  116. Scheduler sched = schedulerFactory.getScheduler();
  117.  
  118. TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName);
  119.  
  120. sched.pauseTrigger(triggerKey);// 停止触发器
  121. sched.unscheduleJob(triggerKey);// 移除触发器
  122. sched.deleteJob(JobKey.jobKey(jobName, jobGroupName));// 删除任务
  123. } catch (Exception e) {
  124. throw new RuntimeException(e);
  125. }
  126. }
  127.  
  128. /**
  129. * @Description:启动所有定时任务
  130. */
  131. public static void startJobs() {
  132. try {
  133. Scheduler sched = schedulerFactory.getScheduler();
  134. sched.start();
  135. } catch (Exception e) {
  136. throw new RuntimeException(e);
  137. }
  138. }
  139.  
  140. /**
  141. * @Description:关闭所有定时任务
  142. */
  143. public static void shutdownJobs() {
  144. try {
  145. Scheduler sched = schedulerFactory.getScheduler();
  146. if (!sched.isShutdown()) {
  147. sched.shutdown();
  148. }
  149. } catch (Exception e) {
  150. throw new RuntimeException(e);
  151. }
  152. }
  153. }
  154.  
  155. MyJob.java 任务类
  156.  
  157. import java.util.Date;
  158.  
  159. import org.quartz.Job;
  160. import org.quartz.JobExecutionContext;
  161. import org.quartz.JobExecutionException;
  162.  
  163. public class MyJob implements Job{
  164.  
  165. public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
  166. System.out.println(new Date() + ": doing something...");
  167. }
  168. }
  169.  
  170. Test.Java 测试类
  171.  
  172. public class Test {
  173.  
  174. public static String JOB_NAME = "动态任务调度";
  175. public static String TRIGGER_NAME = "动态任务触发器";
  176. public static String JOB_GROUP_NAME = "XLXXCC_JOB_GROUP";
  177. public static String TRIGGER_GROUP_NAME = "XLXXCC_JOB_GROUP";
  178.  
  179. public static void main(String[] args) {
  180. try {
  181. System.out.println("【系统启动】开始(每1秒输出一次)...");
  182. QuartzManager.addJob(JOB_NAME, JOB_GROUP_NAME, TRIGGER_NAME, TRIGGER_GROUP_NAME, MyJob.class, "0/1 * * * * ?");
  183.  
  184. Thread.sleep(5000);
  185. System.out.println("【修改时间】开始(每5秒输出一次)...");
  186. QuartzManager.modifyJobTime(JOB_NAME, JOB_GROUP_NAME, TRIGGER_NAME, TRIGGER_GROUP_NAME, "0/5 * * * * ?");
  187.  
  188. Thread.sleep(6000);
  189. System.out.println("【移除定时】开始...");
  190. QuartzManager.removeJob(JOB_NAME, JOB_GROUP_NAME, TRIGGER_NAME, TRIGGER_GROUP_NAME);
  191. System.out.println("【移除定时】成功");
  192. } catch (Exception e) {
  193. e.printStackTrace();
  194. }
  195. }
  196. }

原文地址: http://blog.csdn.net/xlxxcc/article/details/52115995

感谢原作者的无私分享

Quartz 2.2 动态添加、修改和删除定时任务的更多相关文章

  1. Quartz动态添加、修改和删除定时任务

    任务调度开源框架Quartz动态添加.修改和删除定时任务 Quartz 是个开源的作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制.Quartz框架包含了调度器监听.作业和触 ...

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

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

  3. Quartz 2.3 动态添加、修改和删除定时任务

    下面直接上代码: <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>qu ...

  4. JS动态添加option和删除option

    1.动态创建select function createSelect(){ var mySelect = document.createElement("select");     ...

  5. 利用jquery给指定的table动态添加一行、删除一行

    转自:http://www.cnblogs.com/linjiqin/p/3148181.html $("#mytable tr").find("td:nth-child ...

  6. Android学习探索之App多渠道打包及动态添加修改资源属性

    前言: 关于Android渠道打包是一个比较老的话题,今天主要记录总结一下多渠道打包以及如果动态配置修改一些资源属性.今天以公司实际需求为例进行演示,由于项目复用很多公共的业务组件,而且业务组件之间的 ...

  7. 利用jquery给指定的table动态添加一行、删除一行,复制,值不重复等操作

    $("#mytable tr").find("td:nth-child(1)") 1表示获取每行的第一列$("#mytable tr").f ...

  8. 原生js动态添加新元素、删除元素方法

    1. 添加新元素 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> < ...

  9. ASP.NET给前端动态添加修改 CSS样式JS 标题 关键字

    有很多网站读者能换自己喜欢的样式,还有一些网站想多站点共享后端代码而只动前段样式,可以采用动态替换CSS样式和JS. 如果是webform 开发,可以用下列方法: 流程是首先从数据中或者xml读取数据 ...

随机推荐

  1. vue-router使用 看着篇就够了

    官网地址:https://router.vuejs.org/zh/ 先来个自我介绍吧,我就是你们口中的路由,我的作用就是告诉你们怎么到达某地,比如你想去一个地方(前提是这个地方是已经存在的)我会查询我 ...

  2. Antd Select组件结合使用出现must set key for <rc-animate> children问题

    一.以下情况可能导致错误发生 出现这个问题的首要条件是因为Select的mode 设置成multiple or tags 1. Select的defaultValue使用了空字符串 例如: const ...

  3. ubuntu使用抓包工具,charles

    参考官网:https://www.charlesproxy.com/documentation/installation/apt-repository/ wget -q -O - https://ww ...

  4. Axure下拉列表的交互事件 + 自定义元件库

    下拉列表的交互事件: 场景:当点击第一个下拉列表框的江苏时,第二个列表框会显示江苏省的城市:当点击第一个下拉列表框的北京时,第二个列表框会显示北京市的区 操作:把第二个列表框设置为动态面板,设置为两种 ...

  5. Oracle高级查询之over(partition by...)

    现有表,数据如下: eg1:查询年龄第二的队员 通常写法: select * from (select a.*, rownum r from (select t.* from l_student_in ...

  6. 容器虚拟网卡与网桥docker0虚拟网卡的veth pair的配对

    一)基本知识: Docker 安装时会自动在 host 上创建三个网络:none,host,和bridge:详细说明可参考其它文档.我们可用 docker network ls 命令查看: 基于DRI ...

  7. Python的类的下划线命名的区别

    首先,单下划线开头,这个常被用于模块中,在一个模块中以单下划线开头的变量和函数被默认当做内部函数,如果使用from  module  import  *导入时,这部分变量和函数不会被导入.注意,如果使 ...

  8. 交换机telnet配置

    新开箱交换机开机配置Telnet需要三个步骤: 1.开启telnet是能:系统视图模式下输入命令: telnet server enable #开启telnet功能# 2.Telnet创建账号:aaa ...

  9. vue2 商城首页轮播图切换

    home.vue <template> <div class="home"> <HomeBanner></HomeBanner> & ...

  10. 一些重要的k8s概念

    1. Pause容器是什么 作为init pod存在,其他pod都会从pause 容器中fork出来 由pause容器管理 pause容器的工作 可知kubernetes的pod抽象基于Linux的n ...