任务调度开源框架Quartz动态添加、修改和删除定时任务

Quartz 是个开源的作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制。Quartz框架包含了调度器监听、作业和触发器监听。你可以配置作业和触发器监听为全局监听或者是特定于作业和触发器的监听。Quartz 允许开发人员根据时间间隔(或天)来调度作业。它实现了作业和触发器的多对多关系,还能把多个作业与不同的触发器关联。整合了 Quartz 的应用程序可以重用来自不同事件的作业,还可以为一个事件组合多个作业。并且还能和Spring配置整合使用。Quartz在功能上远远超越了JDK自带的Timer,很好很强大!好啦,直接上代码:

[java] view plaincopy

 
  1. /**
  2. * @Description:
  3. *
  4. * @Title: QuartzManager.java
  5. * @Package com.joyce.quartz
  6. * @Copyright: Copyright (c) 2014
  7. *
  8. * @author Comsys-LZP
  9. * @date 2014-6-26 下午03:15:52
  10. * @version V2.0
  11. */
  12. package com.joyce.quartz;
  13. import org.quartz.CronTrigger;
  14. import org.quartz.JobDetail;
  15. import org.quartz.Scheduler;
  16. import org.quartz.SchedulerFactory;
  17. import org.quartz.impl.StdSchedulerFactory;
  18. /**
  19. * @Description: 定时任务管理类
  20. *
  21. * @ClassName: QuartzManager
  22. * @Copyright: Copyright (c) 2014
  23. *
  24. * @author Comsys-LZP
  25. * @date 2014-6-26 下午03:15:52
  26. * @version V2.0
  27. */
  28. public class QuartzManager {
  29. private static SchedulerFactory gSchedulerFactory = new StdSchedulerFactory();
  30. private static String JOB_GROUP_NAME = "EXTJWEB_JOBGROUP_NAME";
  31. private static String TRIGGER_GROUP_NAME = "EXTJWEB_TRIGGERGROUP_NAME";
  32. /**
  33. * @Description: 添加一个定时任务,使用默认的任务组名,触发器名,触发器组名
  34. *
  35. * @param jobName
  36. *            任务名
  37. * @param cls
  38. *            任务
  39. * @param time
  40. *            时间设置,参考quartz说明文档
  41. *
  42. * @Title: QuartzManager.java
  43. * @Copyright: Copyright (c) 2014
  44. *
  45. * @author Comsys-LZP
  46. * @date 2014-6-26 下午03:47:44
  47. * @version V2.0
  48. */
  49. @SuppressWarnings("unchecked")
  50. public static void addJob(String jobName, Class cls, String time) {
  51. try {
  52. Scheduler sched = gSchedulerFactory.getScheduler();
  53. JobDetail jobDetail = new JobDetail(jobName, JOB_GROUP_NAME, cls);// 任务名,任务组,任务执行类
  54. // 触发器
  55. CronTrigger trigger = new CronTrigger(jobName, TRIGGER_GROUP_NAME);// 触发器名,触发器组
  56. trigger.setCronExpression(time);// 触发器时间设定
  57. sched.scheduleJob(jobDetail, trigger);
  58. // 启动
  59. if (!sched.isShutdown()) {
  60. sched.start();
  61. }
  62. } catch (Exception e) {
  63. throw new RuntimeException(e);
  64. }
  65. }
  66. /**
  67. * @Description: 添加一个定时任务
  68. *
  69. * @param jobName
  70. *            任务名
  71. * @param jobGroupName
  72. *            任务组名
  73. * @param triggerName
  74. *            触发器名
  75. * @param triggerGroupName
  76. *            触发器组名
  77. * @param jobClass
  78. *            任务
  79. * @param time
  80. *            时间设置,参考quartz说明文档
  81. *
  82. * @Title: QuartzManager.java
  83. * @Copyright: Copyright (c) 2014
  84. *
  85. * @author Comsys-LZP
  86. * @date 2014-6-26 下午03:48:15
  87. * @version V2.0
  88. */
  89. @SuppressWarnings("unchecked")
  90. public static void addJob(String jobName, String jobGroupName,
  91. String triggerName, String triggerGroupName, Class jobClass,
  92. String time) {
  93. try {
  94. Scheduler sched = gSchedulerFactory.getScheduler();
  95. JobDetail jobDetail = new JobDetail(jobName, jobGroupName, jobClass);// 任务名,任务组,任务执行类
  96. // 触发器
  97. CronTrigger trigger = new CronTrigger(triggerName, triggerGroupName);// 触发器名,触发器组
  98. trigger.setCronExpression(time);// 触发器时间设定
  99. sched.scheduleJob(jobDetail, trigger);
  100. } catch (Exception e) {
  101. throw new RuntimeException(e);
  102. }
  103. }
  104. /**
  105. * @Description: 修改一个任务的触发时间(使用默认的任务组名,触发器名,触发器组名)
  106. *
  107. * @param jobName
  108. * @param time
  109. *
  110. * @Title: QuartzManager.java
  111. * @Copyright: Copyright (c) 2014
  112. *
  113. * @author Comsys-LZP
  114. * @date 2014-6-26 下午03:49:21
  115. * @version V2.0
  116. */
  117. @SuppressWarnings("unchecked")
  118. public static void modifyJobTime(String jobName, String time) {
  119. try {
  120. Scheduler sched = gSchedulerFactory.getScheduler();
  121. CronTrigger trigger = (CronTrigger) sched.getTrigger(jobName,TRIGGER_GROUP_NAME);
  122. if (trigger == null) {
  123. return;
  124. }
  125. String oldTime = trigger.getCronExpression();
  126. if (!oldTime.equalsIgnoreCase(time)) {
  127. JobDetail jobDetail = sched.getJobDetail(jobName,JOB_GROUP_NAME);
  128. Class objJobClass = jobDetail.getJobClass();
  129. removeJob(jobName);
  130. addJob(jobName, objJobClass, time);
  131. }
  132. } catch (Exception e) {
  133. throw new RuntimeException(e);
  134. }
  135. }
  136. /**
  137. * @Description: 修改一个任务的触发时间
  138. *
  139. * @param triggerName
  140. * @param triggerGroupName
  141. * @param time
  142. *
  143. * @Title: QuartzManager.java
  144. * @Copyright: Copyright (c) 2014
  145. *
  146. * @author Comsys-LZP
  147. * @date 2014-6-26 下午03:49:37
  148. * @version V2.0
  149. */
  150. public static void modifyJobTime(String triggerName,
  151. String triggerGroupName, String time) {
  152. try {
  153. Scheduler sched = gSchedulerFactory.getScheduler();
  154. CronTrigger trigger = (CronTrigger) sched.getTrigger(triggerName,triggerGroupName);
  155. if (trigger == null) {
  156. return;
  157. }
  158. String oldTime = trigger.getCronExpression();
  159. if (!oldTime.equalsIgnoreCase(time)) {
  160. CronTrigger ct = (CronTrigger) trigger;
  161. // 修改时间
  162. ct.setCronExpression(time);
  163. // 重启触发器
  164. sched.resumeTrigger(triggerName, triggerGroupName);
  165. }
  166. } catch (Exception e) {
  167. throw new RuntimeException(e);
  168. }
  169. }
  170. /**
  171. * @Description: 移除一个任务(使用默认的任务组名,触发器名,触发器组名)
  172. *
  173. * @param jobName
  174. *
  175. * @Title: QuartzManager.java
  176. * @Copyright: Copyright (c) 2014
  177. *
  178. * @author Comsys-LZP
  179. * @date 2014-6-26 下午03:49:51
  180. * @version V2.0
  181. */
  182. public static void removeJob(String jobName) {
  183. try {
  184. Scheduler sched = gSchedulerFactory.getScheduler();
  185. sched.pauseTrigger(jobName, TRIGGER_GROUP_NAME);// 停止触发器
  186. sched.unscheduleJob(jobName, TRIGGER_GROUP_NAME);// 移除触发器
  187. sched.deleteJob(jobName, JOB_GROUP_NAME);// 删除任务
  188. } catch (Exception e) {
  189. throw new RuntimeException(e);
  190. }
  191. }
  192. /**
  193. * @Description: 移除一个任务
  194. *
  195. * @param jobName
  196. * @param jobGroupName
  197. * @param triggerName
  198. * @param triggerGroupName
  199. *
  200. * @Title: QuartzManager.java
  201. * @Copyright: Copyright (c) 2014
  202. *
  203. * @author Comsys-LZP
  204. * @date 2014-6-26 下午03:50:01
  205. * @version V2.0
  206. */
  207. public static void removeJob(String jobName, String jobGroupName,
  208. String triggerName, String triggerGroupName) {
  209. try {
  210. Scheduler sched = gSchedulerFactory.getScheduler();
  211. sched.pauseTrigger(triggerName, triggerGroupName);// 停止触发器
  212. sched.unscheduleJob(triggerName, triggerGroupName);// 移除触发器
  213. sched.deleteJob(jobName, jobGroupName);// 删除任务
  214. } catch (Exception e) {
  215. throw new RuntimeException(e);
  216. }
  217. }
  218. /**
  219. * @Description:启动所有定时任务
  220. *
  221. *
  222. * @Title: QuartzManager.java
  223. * @Copyright: Copyright (c) 2014
  224. *
  225. * @author Comsys-LZP
  226. * @date 2014-6-26 下午03:50:18
  227. * @version V2.0
  228. */
  229. public static void startJobs() {
  230. try {
  231. Scheduler sched = gSchedulerFactory.getScheduler();
  232. sched.start();
  233. } catch (Exception e) {
  234. throw new RuntimeException(e);
  235. }
  236. }
  237. /**
  238. * @Description:关闭所有定时任务
  239. *
  240. *
  241. * @Title: QuartzManager.java
  242. * @Copyright: Copyright (c) 2014
  243. *
  244. * @author Comsys-LZP
  245. * @date 2014-6-26 下午03:50:26
  246. * @version V2.0
  247. */
  248. public static void shutdownJobs() {
  249. try {
  250. Scheduler sched = gSchedulerFactory.getScheduler();
  251. if (!sched.isShutdown()) {
  252. sched.shutdown();
  253. }
  254. } catch (Exception e) {
  255. throw new RuntimeException(e);
  256. }
  257. }
  258. }

以上就是quartz任务调度对于任务的常用操作,封装起来以便在外部调用!这样我们就需要任务的执行了:

[java] view plaincopy

 
  1. /**
  2. * @Description:
  3. *
  4. * @Title: QuartzJob.java
  5. * @Package com.joyce.quartz
  6. * @Copyright: Copyright (c) 2014
  7. *
  8. * @author Comsys-LZP
  9. * @date 2014-6-26 下午03:37:11
  10. * @version V2.0
  11. */
  12. package com.joyce.quartz;
  13. import java.text.SimpleDateFormat;
  14. import java.util.Date;
  15. import org.quartz.Job;
  16. import org.quartz.JobExecutionContext;
  17. import org.quartz.JobExecutionException;
  18. /**
  19. * @Description: 任务执行类
  20. *
  21. * @ClassName: QuartzJob
  22. * @Copyright: Copyright (c) 2014
  23. *
  24. * @author Comsys-LZP
  25. * @date 2014-6-26 下午03:37:11
  26. * @version V2.0
  27. */
  28. public class QuartzJob implements Job {
  29. @Override
  30. public void execute(JobExecutionContext arg0) throws JobExecutionException {
  31. System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())+ "★★★★★★★★★★★");
  32. }
  33. }

Ok,我们来测试一下:

[java] view plaincopy

 
  1. /**
  2. * @Description:
  3. *
  4. * @Title: QuartzTest.java
  5. * @Package com.joyce.quartz.main
  6. * @Copyright: Copyright (c) 2014
  7. *
  8. * @author Comsys-LZP
  9. * @date 2014-6-26 下午03:35:05
  10. * @version V2.0
  11. */
  12. package com.joyce.quartz.main;
  13. import com.joyce.quartz.QuartzJob;
  14. import com.joyce.quartz.QuartzManager;
  15. /**
  16. * @Description: 测试类
  17. *
  18. * @ClassName: QuartzTest
  19. * @Copyright: Copyright (c) 2014
  20. *
  21. * @author Comsys-LZP
  22. * @date 2014-6-26 下午03:35:05
  23. * @version V2.0
  24. */
  25. public class QuartzTest {
  26. public static void main(String[] args) {
  27. try {
  28. String job_name = "动态任务调度";
  29. System.out.println("【系统启动】开始(每1秒输出一次)...");
  30. QuartzManager.addJob(job_name, QuartzJob.class, "0/1 * * * * ?");
  31. Thread.sleep(5000);
  32. System.out.println("【修改时间】开始(每2秒输出一次)...");
  33. QuartzManager.modifyJobTime(job_name, "10/2 * * * * ?");
  34. Thread.sleep(6000);
  35. System.out.println("【移除定时】开始...");
  36. QuartzManager.removeJob(job_name);
  37. System.out.println("【移除定时】成功");
  38. System.out.println("【再次添加定时任务】开始(每10秒输出一次)...");
  39. QuartzManager.addJob(job_name, QuartzJob.class, "*/10 * * * * ?");
  40. Thread.sleep(60000);
  41. System.out.println("【移除定时】开始...");
  42. QuartzManager.removeJob(job_name);
  43. System.out.println("【移除定时】成功");
  44. } catch (Exception e) {
  45. e.printStackTrace();
  46. }
  47. }
  48. }

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

  1. Quartz动态添加,修改,删除任务(暂停,任务状态,恢复,最近触发时间)

    首页 博客 学院 下载 图文课 论坛 APP 问答 商城 VIP会员 活动 招聘 ITeye GitChat 写博客 小程序 消息 登录注册 关闭 quartz_Cron表达式一分钟教程 09-05 ...

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

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

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

    QuartzManager.Java 动态添加.修改和删除定时任务管理类 import org.quartz.CronScheduleBuilder; import org.quartz.CronTr ...

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

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

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

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

  6. 动态quartz新增、修改、删除

    1.定义job导出类 public class MyQuartzJob implements Job { private static Logger logger = LoggerFactory.ge ...

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

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

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

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

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

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

随机推荐

  1. vs2012用wpf制作透明窗口中报错的解决方案

    在开发wpf项目时,需要调用外部com组件,同时需要制作透明窗口,于是问题出现了,当我们在设置 AllowsTransparency="True"后,com组件显示不出来了,只有透 ...

  2. Linux nmon 监控工具使用

    Linux 系统下监控指标及指标查看 一.工具介绍     Linux 系统下资源监控使用nmon 工具.它可以帮助在一个屏幕上显示所有重要的性能优化信息,并动态地对其进行更新且并不会消耗大量的CPU ...

  3. Vbox安装oracle-linux报错:VT-x features locked or unavailable in M

    1.安装完Vbox后,通过vbox来安装oracle-linux时报“VT-x features locked or unavailable in MSR”: 2.报错原因:CPU没有开启虚拟化支持 ...

  4. 修改info

      新增Key: NSLocationAlwaysUsageDescription 和 NSLocationWhenInUseUsageDescription ,这两个Key的值将分别用于描述应用程序 ...

  5. 编译dubbo2.5.4时遇到的问题及解决

    dubbo的官方git地址为:https://github.com/alibaba/dubbo 按照其流程进行下载及编译,遇到的问题为: 1. 执行 mvn clean install -Dmaven ...

  6. JavaScript string array 数组

    Array类可以如下定义: var aValues = new Array(); 如果预先知道数组的长度,可以用参数传递长度 var aValues = new Array(20); -------- ...

  7. FACL的使用

    ACL的使用 ACL即Access Control List 主要的目的是提供传统的owner,group,others的read,write,execute权限之外的具体权限设置,ACL可以针对单一 ...

  8. 导致Asp.Net站点重启的10个原因 ,记录重启原因

    Asp.Net站点有时候会莫名其妙的重启,什么原因导致的却不得而知,经过一番折腾后,我总结了导致Asp.Net站点重启的10个原因 1. 回收应用程序池会导致站点重启,记录的原因是: HostingE ...

  9. PAT-乙级-1049. 数列的片段和(20)

    1049. 数列的片段和(20) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CAO, Peng 给定一个正数数列,我们可以从中截 ...

  10. Splay树再学习

    队友最近可能在学Splay,然后让我敲下HDU1754的题,其实是很裸的一个线段树,不过用下Splay也无妨,他说他双旋超时,单旋过了,所以我就敲来看下.但是之前写的那个Splay越发的觉得不能看,所 ...