java quartz实例_Quartz应用实践入门案例二(基于java工程)

在web应用程序中添加定时任务,Quartz的简单介绍可以参看博文《Quartz应用实践入门案例一(基于Web应用)》 。其实一旦学会了如何应用开源框架就应该很容易将这中框架应用与自己的任何程序中。只要你的程序中需要这项功能!但是对于一些刚开始学习某种框架的菜鸟而言,这似乎就不是那么简单了。如果在学习开源框架API的同时,能有一两个案例小程序配着其API去看,那应该就是事半功倍了。

本文是在自己学习源码和网上查找资料的基础上完成的,将详细叙述在java工程中如何巧妙的融入Quartz框架,小案例的运行你会发现在不用xml配置文件的时候,依然是如此的简单。通过这两篇博文的学习你会知道如何在不同的应用软件中部署这种框架。这些个小程序仅供参考学习用,博文版权归作者和博客园共有。

如果你先看了《Quartz应用实践入门案例一(基于Web应用)》这篇博文,那么看这篇时,你会觉得比较轻松。因为其配置的原理和大概的走向都是一样的。最主要的不同就是将web应用程序中的xml配置写入了java源码中。直接运行(main方法测试通过)。如果你是大神级人物,欢迎拍砖,其他的。我们就共同学习,共同进步。

先说一下这个小程序demo的主要效果:每隔2s向控制台输出当前时间,具体形式参见最后运行结果。

一.新建项目java项目:

注意:不是web工程;

二. 添加包名和jar包:

在src目下建立包 com.red.quartz;

在项目目录下见文件夹,命名为lib,用于存放项目所需的jar包;

然后将所需的jar包拷贝到lib文件夹下,然后build path到自己的项目中。实现过程如图示:

039d658fc4aa98990ab6d451183a96c8.png

项目结构图:

01967f7f47bbaca25f69e9053051b88a.png

三. 在quartz包下见一个quartz管理的java类,即:quartz管理器(quartz控制器),为  QuartzController.java:

1 private static SchedulerFactory gSchedulerFactory = newStdSchedulerFactory();2 private static String JOB_GROUP_NAME = "EXTJWEB_JOBGROUP_NAME";3 private static String TRIGGER_GROUP_NAME = "EXTJWEB_TRIGGERGROUP_NAME";4

5 public static voidaddJob(String jobName, String jobClass, String time) {6 try{7 Scheduler sched =gSchedulerFactory.getScheduler();8 JobDetail jobDetail = new JobDetail(jobName, JOB_GROUP_NAME, Class.forName(jobClass));//任务名,任务组,任务执行类9 //触发器

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

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

12 sched.scheduleJob(jobDetail, trigger);13 //启动

14 if (!sched.isShutdown()){15 sched.start();16 }17 } catch(Exception e) {18 e.printStackTrace();19 throw newRuntimeException(e);20 }21 }

四.新建一个TestJob类,继承job接口,并实现execute方法:

1     @SuppressWarnings("deprecation")2 public void execute(JobExecutionContext arg0) throwsJobExecutionException {3 System.out.println(Calendar.getInstance().getTime().toLocaleString()+ "★★★★★★★★★★★");4 }

java代码方面的quartz已经就做完了。只需要写一个测试类main方法,就可以查看这个程序的运行效果。

测试main方法如下:

1 public static voidmain(String[] args) {2 QuartzController qm=newQuartzController();3 String ts="com.red.quartz.TestJob";4 qm.addJob("job", ts, "0/2 * * * * ?");5 }

五. 程序运行效果如下:

18ef90d9cb553f8f33ba1e34f0c24889.png

六. 程序之外:

在xml和java代码中应用Quartz框架,总结一些基础配置的使用:

时间配置,网上搜一下就是一大把这方面的配置信息,只总结一些重要的知识:

星号由左到右按顺序代表 :     *    *     *     *    *     *   *

格式: [秒] [分] [小时] [日] [月] [周] [年]

通配符说明:

* 表示所有值. 例如:在分的字段上设置 "*",表示每一分钟都会触发。

? 表示不指定值。使用的场景为不需要关心当前设置这个字段的值。例如:要在每月的10号触发一个操作,但不关心是周几,所以需要周位置的那个字段设置为"?" 具体设置为 0 0 0 10 * ?

- 表示区间。例如 在小时上设置 "10-12",表示 10,11,12点都会触发。

, 表示指定多个值,例如在周字段上设置 "MON,WED,FRI" 表示周一,周三和周五触发

/ 用于递增触发。如在秒上面设置"5/15" 表示从5秒开始,每增15秒触发(5,20,35,50)。在月字段上设置'1/3'所示每月1号开始,每隔三天触发一次。

L 表示最后的意思。在日字段设置上,表示当月的最后一天(依据当前月份,如果是二月还会依据是否是润年[leap]), 在周字段上表示星期六,相当于"7"或"SAT"。如果在"L"前加上数字,则                        表示该数据的最后一个。例如在周字段上设置"6L"这样的格式,则表示“本月最后一个星期五"

W 表示离指定日期的最近那个工作日(周一至周五). 例如在日字段上设置"15W",表示离每月15号最近的那个工作日触发。如果15号正好是周六,则找最近的周五(14号)触发, 如果15号是周                         未,则找最近的下周一(16号)触发.如果15号正好在工作日(周一至周五),则就在该天触发。如果指定格式为 "1W",它则表示每月1号往后最近的工作日触发。如果1号正是周六,则将在3号下周一触                       发。(注,"W"前只能设置具体的数字,不允许区间"-").

提示

'L'和 'W'可以一组合使用。如果在日字段上设置"LW",则表示在本月的最后一个工作日触发(一般指发工资 )

# 序号(表示每月的第几个周几),例如在周字段上设置"6#3"表示在每月的第三个周六.注意如果指定"#5",正好第五周没有周六,则不会触发该配置(用在母亲节和父亲节再合适不过了)

周字段的设置,若使用英文字母是不区分大小写的 MON 与mon相同.

关于常用时间配置实例,自己百度。

给一些希望深入学习Quartz的朋友:QuartzController.java中源码可以有很好的控制job。尽管本案例只是实现了一个任务,但是自己亲测,多个是没有任何问题的。

1 packagecom.red.quartz;2

3 importjava.text.ParseException;4

5 importorg.quartz.CronTrigger;6 importorg.quartz.JobDetail;7 importorg.quartz.Scheduler;8 importorg.quartz.SchedulerException;9 importorg.quartz.SchedulerFactory;10 importorg.quartz.impl.StdSchedulerFactory;11

12 /**

13 * 定时任务管理类14 */

15 public classQuartzController {16 private static SchedulerFactory gSchedulerFactory = newStdSchedulerFactory();17 private static String JOB_GROUP_NAME = "EXTJWEB_JOBGROUP_NAME";18 private static String TRIGGER_GROUP_NAME = "EXTJWEB_TRIGGERGROUP_NAME";19

20 /**

21 * 添加一个定时任务,使用默认的任务组名,触发器名,触发器组名22 *23 *@paramjobName24 * 任务名25 *@paramjobClass26 * 任务27 *@paramtime28 * 时间设置,参考quartz说明文档29 */

30 public static voidaddJob(String jobName, String jobClass, String time) {31 try{32 Scheduler sched =gSchedulerFactory.getScheduler();33 JobDetail jobDetail = newJobDetail(jobName, JOB_GROUP_NAME,34 Class.forName(jobClass));//任务名,任务组,任务执行类35 //触发器

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

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

38 sched.scheduleJob(jobDetail, trigger);39 //启动

40 if (!sched.isShutdown()) {41 sched.start();42 }43 } catch(Exception e) {44 e.printStackTrace();45 throw newRuntimeException(e);46 }47 }48

49 /**

50 * 添加一个定时任务51 *52 *@paramjobName53 * 任务名54 *@paramjobGroupName55 * 任务组名56 *@paramtriggerName57 * 触发器名58 *@paramtriggerGroupName59 * 触发器组名60 *@paramjobClass61 * 任务62 *@paramtime63 * 时间设置,参考quartz说明文档64 */

65 public static voidaddJob(String jobName, String jobGroupName,66 String triggerName, String triggerGroupName, String jobClass,67 String time) {68 try{69 Scheduler sched =gSchedulerFactory.getScheduler();70 JobDetail jobDetail = newJobDetail(jobName, jobGroupName,71 Class.forName(jobClass));//任务名,任务组,任务执行类72 //触发器

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

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

75 sched.scheduleJob(jobDetail, trigger);76 } catch(Exception e) {77 e.printStackTrace();78 throw newRuntimeException(e);79 }80 }81

82 /**

83 * 修改一个任务的触发时间(使用默认的任务组名,触发器名,触发器组名)84 *85 *@paramjobName86 *@paramtime87 */

88 public static voidmodifyJobTime(String jobName, String time) {89 try{90 Scheduler sched =gSchedulerFactory.getScheduler();91 CronTrigger trigger =(CronTrigger) sched.getTrigger(jobName,92 TRIGGER_GROUP_NAME);93 if (trigger == null) {94 return;95 }96 String oldTime =trigger.getCronExpression();97 if (!oldTime.equalsIgnoreCase(time)) {98 JobDetail jobDetail =sched.getJobDetail(jobName,99 JOB_GROUP_NAME);100 Class objJobClass =jobDetail.getJobClass();101 String jobClass =objJobClass.getName();102 removeJob(jobName);103

104 addJob(jobName, jobClass, time);105 }106 } catch(Exception e) {107 e.printStackTrace();108 throw newRuntimeException(e);109 }110 }111

112 /**

113 * 修改一个任务的触发时间114 *115 *@paramtriggerName116 *@paramtriggerGroupName117 *@paramtime118 */

119 public static voidmodifyJobTime(String triggerName,120 String triggerGroupName, String time) {121 try{122 Scheduler sched =gSchedulerFactory.getScheduler();123 CronTrigger trigger =(CronTrigger) sched.getTrigger(triggerName,124 triggerGroupName);125 if (trigger == null) {126 return;127 }128 String oldTime =trigger.getCronExpression();129 if (!oldTime.equalsIgnoreCase(time)) {130 CronTrigger ct =(CronTrigger) trigger;131 //修改时间

132 ct.setCronExpression(time);133 //重启触发器

134 sched.resumeTrigger(triggerName, triggerGroupName);135 }136 } catch(Exception e) {137 e.printStackTrace();138 throw newRuntimeException(e);139 }140 }141

142 /**

143 * 移除一个任务(使用默认的任务组名,触发器名,触发器组名)144 *145 *@paramjobName146 */

147 public static voidremoveJob(String jobName) {148 try{149 Scheduler sched =gSchedulerFactory.getScheduler();150 sched.pauseTrigger(jobName, TRIGGER_GROUP_NAME);//停止触发器

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

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

153 } catch(Exception e) {154 e.printStackTrace();155 throw newRuntimeException(e);156 }157 }158

159 /**

160 * 移除一个任务161 *162 *@paramjobName163 *@paramjobGroupName164 *@paramtriggerName165 *@paramtriggerGroupName166 */

167 public static voidremoveJob(String jobName, String jobGroupName,168 String triggerName, String triggerGroupName) {169 try{170 Scheduler sched =gSchedulerFactory.getScheduler();171 sched.pauseTrigger(triggerName, triggerGroupName);//停止触发器

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

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

174 } catch(Exception e) {175 e.printStackTrace();176 throw newRuntimeException(e);177 }178 }179

180 /**

181 * 启动所有定时任务182 */

183 public static voidstartJobs() {184 try{185 Scheduler sched =gSchedulerFactory.getScheduler();186 sched.start();187 } catch(Exception e) {188 e.printStackTrace();189 throw newRuntimeException(e);190 }191 }192

193 /**

194 * 关闭所有定时任务195 */

196 public static voidshutdownJobs() {197 try{198 Scheduler sched =gSchedulerFactory.getScheduler();199 if (!sched.isShutdown()) {200 sched.shutdown();201 }202 } catch(Exception e) {203 e.printStackTrace();204 throw newRuntimeException(e);205 }206 }207 }

本文源码下载

作者:itRed 邮箱:it_red@sina.com

博客链接:http://www.cnblogs.com/itred

版权声明:本文版权归作者和博客园共有,欢迎转载,但请在文章显眼位置标明文章出处。未经本人书面同意,将其作为他用,本人保留追究责任的所有权利。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值