文档章节

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

奋斗的小菜一碟
 奋斗的小菜一碟
发布于 2015/12/07 11:18
字数 1369
阅读 262
收藏 13

 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.   

  14. import org.quartz.CronTrigger;  

  15. import org.quartz.JobDetail;  

  16. import org.quartz.Scheduler;  

  17. import org.quartz.SchedulerFactory;  

  18. import org.quartz.impl.StdSchedulerFactory;  

  19.   

  20. /** 

  21.  * @Description: 定时任务管理类 

  22.  *  

  23.  * @ClassName: QuartzManager 

  24.  * @Copyright: Copyright (c) 2014 

  25.  *  

  26.  * @author Comsys-LZP 

  27.  * @date 2014-6-26 下午03:15:52 

  28.  * @version V2.0 

  29.  */  

  30. public class QuartzManager {  

  31.     private static SchedulerFactory gSchedulerFactory = new StdSchedulerFactory();  

  32.     private static String JOB_GROUP_NAME = "EXTJWEB_JOBGROUP_NAME";  

  33.     private static String TRIGGER_GROUP_NAME = "EXTJWEB_TRIGGERGROUP_NAME";  

  34.   

  35.     /** 

  36.      * @Description: 添加一个定时任务,使用默认的任务组名,触发器名,触发器组名 

  37.      *  

  38.      * @param jobName 

  39.      *            任务名 

  40.      * @param cls 

  41.      *            任务 

  42.      * @param time 

  43.      *            时间设置,参考quartz说明文档 

  44.      *  

  45.      * @Title: QuartzManager.java 

  46.      * @Copyright: Copyright (c) 2014 

  47.      *  

  48.      * @author Comsys-LZP 

  49.      * @date 2014-6-26 下午03:47:44 

  50.      * @version V2.0 

  51.      */  

  52.     @SuppressWarnings("unchecked")  

  53.     public static void addJob(String jobName, Class cls, String time) {  

  54.         try {  

  55.             Scheduler sched = gSchedulerFactory.getScheduler();  

  56.             JobDetail jobDetail = new JobDetail(jobName, JOB_GROUP_NAME, cls);// 任务名,任务组,任务执行类  

  57.             // 触发器  

  58.             CronTrigger trigger = new CronTrigger(jobName, TRIGGER_GROUP_NAME);// 触发器名,触发器组  

  59.             trigger.setCronExpression(time);// 触发器时间设定  

  60.             sched.scheduleJob(jobDetail, trigger);  

  61.             // 启动  

  62.             if (!sched.isShutdown()) {  

  63.                 sched.start();  

  64.             }  

  65.         } catch (Exception e) {  

  66.             throw new RuntimeException(e);  

  67.         }  

  68.     }  

  69.   

  70.     /** 

  71.      * @Description: 添加一个定时任务 

  72.      *  

  73.      * @param jobName 

  74.      *            任务名 

  75.      * @param jobGroupName 

  76.      *            任务组名 

  77.      * @param triggerName 

  78.      *            触发器名 

  79.      * @param triggerGroupName 

  80.      *            触发器组名 

  81.      * @param jobClass 

  82.      *            任务 

  83.      * @param time 

  84.      *            时间设置,参考quartz说明文档 

  85.      *  

  86.      * @Title: QuartzManager.java 

  87.      * @Copyright: Copyright (c) 2014 

  88.      *  

  89.      * @author Comsys-LZP 

  90.      * @date 2014-6-26 下午03:48:15 

  91.      * @version V2.0 

  92.      */  

  93.     @SuppressWarnings("unchecked")  

  94.     public static void addJob(String jobName, String jobGroupName,  

  95.             String triggerName, String triggerGroupName, Class jobClass,  

  96.             String time) {  

  97.         try {  

  98.             Scheduler sched = gSchedulerFactory.getScheduler();  

  99.             JobDetail jobDetail = new JobDetail(jobName, jobGroupName, jobClass);// 任务名,任务组,任务执行类  

  100.             // 触发器  

  101.             CronTrigger trigger = new CronTrigger(triggerName, triggerGroupName);// 触发器名,触发器组  

  102.             trigger.setCronExpression(time);// 触发器时间设定  

  103.             sched.scheduleJob(jobDetail, trigger);  

  104.         } catch (Exception e) {  

  105.             throw new RuntimeException(e);  

  106.         }  

  107.     }  

  108.   

  109.     /** 

  110.      * @Description: 修改一个任务的触发时间(使用默认的任务组名,触发器名,触发器组名) 

  111.      *  

  112.      * @param jobName 

  113.      * @param time 

  114.      *  

  115.      * @Title: QuartzManager.java 

  116.      * @Copyright: Copyright (c) 2014 

  117.      *  

  118.      * @author Comsys-LZP 

  119.      * @date 2014-6-26 下午03:49:21 

  120.      * @version V2.0 

  121.      */  

  122.     @SuppressWarnings("unchecked")  

  123.     public static void modifyJobTime(String jobName, String time) {  

  124.         try {  

  125.             Scheduler sched = gSchedulerFactory.getScheduler();  

  126.             CronTrigger trigger = (CronTrigger) sched.getTrigger(jobName,TRIGGER_GROUP_NAME);  

  127.             if (trigger == null) {  

  128.                 return;  

  129.             }  

  130.             String oldTime = trigger.getCronExpression();  

  131.             if (!oldTime.equalsIgnoreCase(time)) {  

  132.                 JobDetail jobDetail = sched.getJobDetail(jobName,JOB_GROUP_NAME);  

  133.                 Class objJobClass = jobDetail.getJobClass();  

  134.                 removeJob(jobName);  

  135.                 addJob(jobName, objJobClass, time);  

  136.             }  

  137.         } catch (Exception e) {  

  138.             throw new RuntimeException(e);  

  139.         }  

  140.     }  

  141.   

  142.     /** 

  143.      * @Description: 修改一个任务的触发时间 

  144.      *  

  145.      * @param triggerName 

  146.      * @param triggerGroupName 

  147.      * @param time 

  148.      *  

  149.      * @Title: QuartzManager.java 

  150.      * @Copyright: Copyright (c) 2014 

  151.      *  

  152.      * @author Comsys-LZP 

  153.      * @date 2014-6-26 下午03:49:37 

  154.      * @version V2.0 

  155.      */  

  156.     public static void modifyJobTime(String triggerName,  

  157.             String triggerGroupName, String time) {  

  158.         try {  

  159.             Scheduler sched = gSchedulerFactory.getScheduler();  

  160.             CronTrigger trigger = (CronTrigger) sched.getTrigger(triggerName,triggerGroupName);  

  161.             if (trigger == null) {  

  162.                 return;  

  163.             }  

  164.             String oldTime = trigger.getCronExpression();  

  165.             if (!oldTime.equalsIgnoreCase(time)) {  

  166.                 CronTrigger ct = (CronTrigger) trigger;  

  167.                 // 修改时间  

  168.                 ct.setCronExpression(time);  

  169.                 // 重启触发器  

  170.                 sched.resumeTrigger(triggerName, triggerGroupName);  

  171.             }  

  172.         } catch (Exception e) {  

  173.             throw new RuntimeException(e);  

  174.         }  

  175.     }  

  176.   

  177.     /** 

  178.      * @Description: 移除一个任务(使用默认的任务组名,触发器名,触发器组名) 

  179.      *  

  180.      * @param jobName 

  181.      *  

  182.      * @Title: QuartzManager.java 

  183.      * @Copyright: Copyright (c) 2014 

  184.      *  

  185.      * @author Comsys-LZP 

  186.      * @date 2014-6-26 下午03:49:51 

  187.      * @version V2.0 

  188.      */  

  189.     public static void removeJob(String jobName) {  

  190.         try {  

  191.             Scheduler sched = gSchedulerFactory.getScheduler();  

  192.             sched.pauseTrigger(jobName, TRIGGER_GROUP_NAME);// 停止触发器  

  193.             sched.unscheduleJob(jobName, TRIGGER_GROUP_NAME);// 移除触发器  

  194.             sched.deleteJob(jobName, JOB_GROUP_NAME);// 删除任务  

  195.         } catch (Exception e) {  

  196.             throw new RuntimeException(e);  

  197.         }  

  198.     }  

  199.   

  200.     /** 

  201.      * @Description: 移除一个任务 

  202.      *  

  203.      * @param jobName 

  204.      * @param jobGroupName 

  205.      * @param triggerName 

  206.      * @param triggerGroupName 

  207.      *  

  208.      * @Title: QuartzManager.java 

  209.      * @Copyright: Copyright (c) 2014 

  210.      *  

  211.      * @author Comsys-LZP 

  212.      * @date 2014-6-26 下午03:50:01 

  213.      * @version V2.0 

  214.      */  

  215.     public static void removeJob(String jobName, String jobGroupName,  

  216.             String triggerName, String triggerGroupName) {  

  217.         try {  

  218.             Scheduler sched = gSchedulerFactory.getScheduler();  

  219.             sched.pauseTrigger(triggerName, triggerGroupName);// 停止触发器  

  220.             sched.unscheduleJob(triggerName, triggerGroupName);// 移除触发器  

  221.             sched.deleteJob(jobName, jobGroupName);// 删除任务  

  222.         } catch (Exception e) {  

  223.             throw new RuntimeException(e);  

  224.         }  

  225.     }  

  226.   

  227.     /** 

  228.      * @Description:启动所有定时任务 

  229.      *  

  230.      *  

  231.      * @Title: QuartzManager.java 

  232.      * @Copyright: Copyright (c) 2014 

  233.      *  

  234.      * @author Comsys-LZP 

  235.      * @date 2014-6-26 下午03:50:18 

  236.      * @version V2.0 

  237.      */  

  238.     public static void startJobs() {  

  239.         try {  

  240.             Scheduler sched = gSchedulerFactory.getScheduler();  

  241.             sched.start();  

  242.         } catch (Exception e) {  

  243.             throw new RuntimeException(e);  

  244.         }  

  245.     }  

  246.   

  247.     /** 

  248.      * @Description:关闭所有定时任务 

  249.      *  

  250.      *  

  251.      * @Title: QuartzManager.java 

  252.      * @Copyright: Copyright (c) 2014 

  253.      *  

  254.      * @author Comsys-LZP 

  255.      * @date 2014-6-26 下午03:50:26 

  256.      * @version V2.0 

  257.      */  

  258.     public static void shutdownJobs() {  

  259.         try {  

  260.             Scheduler sched = gSchedulerFactory.getScheduler();  

  261.             if (!sched.isShutdown()) {  

  262.                 sched.shutdown();  

  263.             }  

  264.         } catch (Exception e) {  

  265.             throw new RuntimeException(e);  

  266.         }  

  267.     }  

  268. }  


以上就是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.   

  14. import java.text.SimpleDateFormat;  

  15. import java.util.Date;  

  16.   

  17. import org.quartz.Job;  

  18. import org.quartz.JobExecutionContext;  

  19. import org.quartz.JobExecutionException;  

  20.   

  21. /** 

  22.  * @Description: 任务执行类 

  23.  * 

  24.  * @ClassName: QuartzJob 

  25.  * @Copyright: Copyright (c) 2014 

  26.  * 

  27.  * @author Comsys-LZP 

  28.  * @date 2014-6-26 下午03:37:11 

  29.  * @version V2.0 

  30.  */  

  31. public class QuartzJob implements Job {  

  32.   

  33.     @Override  

  34.     public void execute(JobExecutionContext arg0) throws JobExecutionException {  

  35.         System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())+ "★★★★★★★★★★★");    

  36.     }  

  37. }  


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.   

  14. import com.joyce.quartz.QuartzJob;  

  15. import com.joyce.quartz.QuartzManager;  

  16.   

  17. /** 

  18.  * @Description: 测试类 

  19.  * 

  20.  * @ClassName: QuartzTest 

  21.  * @Copyright: Copyright (c) 2014 

  22.  * 

  23.  * @author Comsys-LZP 

  24.  * @date 2014-6-26 下午03:35:05 

  25.  * @version V2.0 

  26.  */  

  27. public class QuartzTest {  

  28.     public static void main(String[] args) {  

  29.         try {  

  30.             String job_name = "动态任务调度";  

  31.             System.out.println("【系统启动】开始(每1秒输出一次)...");    

  32.             QuartzManager.addJob(job_name, QuartzJob.class"0/1 * * * * ?");    

  33.               

  34.             Thread.sleep(5000);    

  35.             System.out.println("【修改时间】开始(每2秒输出一次)...");    

  36.             QuartzManager.modifyJobTime(job_name, "10/2 * * * * ?");    

  37.             Thread.sleep(6000);    

  38.             System.out.println("【移除定时】开始...");    

  39.             QuartzManager.removeJob(job_name);    

  40.             System.out.println("【移除定时】成功");    

  41.               

  42.             System.out.println("【再次添加定时任务】开始(每10秒输出一次)...");    

  43.             QuartzManager.addJob(job_name, QuartzJob.class"*/10 * * * * ?");    

  44.             Thread.sleep(60000);    

  45.             System.out.println("【移除定时】开始...");    

  46.             QuartzManager.removeJob(job_name);    

  47.             System.out.println("【移除定时】成功");  

  48.         } catch (Exception e) {  

  49.             e.printStackTrace();  

  50.         }  

  51.     }  

  52. }  


本文转载自:

奋斗的小菜一碟
粉丝 11
博文 35
码字总数 8248
作品 0
广州
程序员
私信 提问
分布式定时任务框架---Uncode Schedule

分布式定时任务框架---Uncode Schedule rabbitGYK 关注 2016.11.27 20:36* 字数 1446 阅读 7141评论 5喜欢 36赞赏 1 博客原文 作为一个支付公司的项目组,经常会有很多对账功能(签约对账、支...

晨猫
2018/11/02
139
0
liuht777/uncode-scheduler

uncode-schedule 基于Spring Task + Zookeeper的分布式任务调度组件,非常小巧,使用简单,只需要引入jar包。不需要单独部署服务端。确保所有任务在集群中不重复,不遗漏的执行。支持动态添加...

liuht777
2017/10/26
0
0
Spring mvc整合mybatis基于mysql数据库实现用户增删改查及其分页显示的完整入门实例【转】

Spring mvc整合mybatis例子, 基于mysql数据库实现对用户的增、删、改、查,及分页显示的完整例子。 查询显示用户 添加用户 更新用户 官方验证: 项目截图 必须修改applicationContext.xml中m...

如何让他和
2016/10/24
452
1
Spring mvc整合mybatis基于mysql数据库实现用户增删改查及其分页显示的完整入门实例【转】

Spring mvc整合mybatis例子, 基于mysql数据库实现对用户的增、删、改、查,及分页显示的完整例子。 查询显示用户 添加用户 更新用户 官方验证: 项目截图 必须修改applicationContext.xml中m...

如何让他和
2016/10/07
1K
1
流行的Java web组成

使用阿里巴巴Druid连接池(高效、功能强大、可扩展性好的数据库连接池、监控数据库访问性能、支持Common-Logging、Log4j和JdkLog,监控数据库访问) 2. 提供高并发JMS消息处理机制 3. 所有功...

-wangming-
2016/04/12
189
0

没有更多内容

加载失败,请刷新页面

加载更多

同名依赖,多次引入导致的程序错误

表现: 本地测试正常,打包上线后报错找不到某个方法(缺少依赖),检测依赖发现,同名依赖有两个版本。 解决:删除一个,程序正常

避难所
26分钟前
3
0
在HTML中的下拉框中实现超连接

<!DOCTYPE html><html lang="zh-CN"><head> <meta charset="UTF-8"> <link rel="canonical" href="https://blog.csdn.net/weixin_34228617/article/details/86130280"/> ......

mickelfeng
32分钟前
3
0
Content7关闭防火墙命令

在外部访问CentOS中部署应用时,需要关闭防火墙。 关闭防火墙命令:systemctl stop firewalld.service 开启防火墙:systemctl start firewalld.service 关闭开机自启动:systemctl disable f...

无名氏的程序员
33分钟前
3
0
分布式存储原理:TiDB

浮躁的码农
45分钟前
6
0
CSS实现圆角边框的完美解决方案

css实现图片圆角,兼容所有浏览器: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 <style type= "text/css" > /*通用样式--容器宽度值*/ .s......

前端老手
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部