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

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

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

  作者:itRed   邮箱:[email protected]    博客:http://www.cnblogs.com/itred

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

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

  一.新建项目java项目:

      注意:不是web工程;

  二. 添加包名和jar包:

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

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

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

          

    项目结构图:

          

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

 1     private static SchedulerFactory gSchedulerFactory = new StdSchedulerFactory();
 2     private static String JOB_GROUP_NAME = "EXTJWEB_JOBGROUP_NAME";
 3     private static String TRIGGER_GROUP_NAME = "EXTJWEB_TRIGGERGROUP_NAME";
 4
 5     public static void addJob(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 new RuntimeException(e);
20             }
21         }

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

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

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

  测试main方法如下:

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

  五. 程序运行效果如下:

    

  六. 程序之外:

    贴出认为比较好的关于quartz学习的文章:http://www.ibm.com/developerworks/cn/java/j-quartz/

    在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 package com.red.quartz;
  2
  3 import java.text.ParseException;
  4
  5 import org.quartz.CronTrigger;
  6 import org.quartz.JobDetail;
  7 import org.quartz.Scheduler;
  8 import org.quartz.SchedulerException;
  9 import org.quartz.SchedulerFactory;
 10 import org.quartz.impl.StdSchedulerFactory;
 11
 12 /**
 13  * 定时任务管理类
 14  */
 15 public class QuartzController {
 16     private static SchedulerFactory gSchedulerFactory = new StdSchedulerFactory();
 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      * @param jobName
 24      *            任务名
 25      * @param jobClass
 26      *            任务
 27      * @param time
 28      *            时间设置,参考quartz说明文档
 29      */
 30     public static void addJob(String jobName, String jobClass, String time) {
 31         try {
 32             Scheduler sched = gSchedulerFactory.getScheduler();
 33             JobDetail jobDetail = new JobDetail(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 new RuntimeException(e);
 46         }
 47     }
 48
 49     /**
 50      * 添加一个定时任务
 51      *
 52      * @param jobName
 53      *            任务名
 54      * @param jobGroupName
 55      *            任务组名
 56      * @param triggerName
 57      *            触发器名
 58      * @param triggerGroupName
 59      *            触发器组名
 60      * @param jobClass
 61      *            任务
 62      * @param time
 63      *            时间设置,参考quartz说明文档
 64      */
 65     public static void addJob(String jobName, String jobGroupName,
 66             String triggerName, String triggerGroupName, String jobClass,
 67             String time) {
 68         try {
 69             Scheduler sched = gSchedulerFactory.getScheduler();
 70             JobDetail jobDetail = new JobDetail(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 new RuntimeException(e);
 79         }
 80     }
 81
 82     /**
 83      * 修改一个任务的触发时间(使用默认的任务组名,触发器名,触发器组名)
 84      *
 85      * @param jobName
 86      * @param time
 87      */
 88     public static void modifyJobTime(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 new RuntimeException(e);
109         }
110     }
111
112     /**
113      * 修改一个任务的触发时间
114      *
115      * @param triggerName
116      * @param triggerGroupName
117      * @param time
118      */
119     public static void modifyJobTime(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 new RuntimeException(e);
139         }
140     }
141
142     /**
143      * 移除一个任务(使用默认的任务组名,触发器名,触发器组名)
144      *
145      * @param jobName
146      */
147     public static void removeJob(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 new RuntimeException(e);
156         }
157     }
158
159     /**
160      * 移除一个任务
161      *
162      * @param jobName
163      * @param jobGroupName
164      * @param triggerName
165      * @param triggerGroupName
166      */
167     public static void removeJob(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 new RuntimeException(e);
177         }
178     }
179
180     /**
181      * 启动所有定时任务
182      */
183     public static void startJobs() {
184         try {
185             Scheduler sched = gSchedulerFactory.getScheduler();
186             sched.start();
187         } catch (Exception e) {
188             e.printStackTrace();
189             throw new RuntimeException(e);
190         }
191     }
192
193     /**
194      * 关闭所有定时任务
195      */
196     public static void shutdownJobs() {
197         try {
198             Scheduler sched = gSchedulerFactory.getScheduler();
199             if (!sched.isShutdown()) {
200                 sched.shutdown();
201             }
202         } catch (Exception e) {
203             e.printStackTrace();
204             throw new RuntimeException(e);
205         }
206     }
207 }

    本文源码下载

作者:itRed     邮箱:[email protected]
博客链接:http://www.cnblogs.com/itred
版权声明:本文版权归作者和博客园共有,欢迎转载,但请在文章显眼位置标明文章出处。未经本人书面同意,将其作为他用,本人保留追究责任的所有权利。
时间: 2024-10-14 23:42:33

Quartz应用实践入门案例二(基于java工程)的相关文章

基于java工程开发RMI服务端

ServiceRegist.java import java.rmi.Remote; import java.rmi.RemoteException; public interface ServiceRegist extends Remote{ public user login(String userName, String password) throws RemoteException; } ServiceRegisterImpl.java public class ServiceRegi

mybatis入门(一)创建java工程搭建mybatis环境

先创建一个java工程MybatisProject,在src下面建包和实体类,并在数据库创建相同的person表,然后导入mybatis-3.4.6.jar包 package com.liusong.entity; public class Person { private int id; private String name; private int age; public Person() { super(); this.id = id; this.name = name; this.ag

MySQL快速入门(二)——Java进阶学习第十六天

文档版本 开发工具 测试平台 工程名字 日期 作者 备注 V1.0 2016.05.10 lutianfei none SQL多表操作 外键约束 作用:保证数据的完整性. 定义外键约束 可以直接在create语句中定义外键 foreign key 当前表名 (字段名) references 目标表名 (目标表的主键) 创建完语句后,可以直接使用修改语句定义 alter table 表名 add foreign key 当前表名 (字段名) references 目标表名 (目标表的主键); 作用

网络爬虫入门——案例二:爬取教务系统中的学生成绩

参考资料: 本帖目标: 1.模拟登陆学校教务系统 2.对教务系统中的学生成绩进行抓取 3.将抓取到的内容保存到excel表格并计算平均成绩和绩点 # -*- coding: utf-8 -*- """ Created on Sat Apr 16 18:26:46 2016 @author: wuhan """ import urllib import urllib2 import cookielib from bs4 import Beautif

_00017 Kafka的体系结构介绍以及Kafka入门案例(初级案例+Java API的使用)

博文作者:妳那伊抹微笑 个性签名:世界上最遥远的距离不是天涯,也不是海角,而是我站在妳的面前,妳却感觉不到我的存在 技术方向:Flume+Kafka+Storm+Redis/Hbase+Hadoop+Hive+Mahout+Spark ... 云计算技术 转载声明:可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明,谢谢合作! qq交流群:214293307  (期待与你一起学习,共同进步) # Kfaka的体系结构 # 学习前言 Kafka的整个学习过程就是自己看官网的文档,出

nodejs入门案例与参数接受

javaScript 前台语言 nodejs 语法基于js 后台 重点 模块的学习 express Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境. Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又高效. Node.js 的包管理器 npm,是全球最大的开源库生态系统. 后台那么多为什么还要node.js 1. 异步事件驱动 2. 非堵塞I/O CPU密集型(CPU-bound) IO密集型(I/O bound) 性能出众 入门 入

ActiveMQ入门案例以及整合Spring的简单实用

先来个ActiveMQ介绍哈: MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法,是一个消息中间件. 应用场景:为了实现系统之间的通信,把系统之间的调用耦合度降低就可以使用MQ. 1) activeMQ 是Apache出品,最流行的,能力强劲的开源消息总线. 2) avtiveMQ主要特点:完全支持JMS1.1和J2EE 1.4规范:支持spring,很容易内嵌到spring中:支持ajax. 3) activeMQ的消息形式: a) 点对点形式,即生产

mondrian与java工程的集成

Mondrian 是一个独立的引擎,一般都是通过嵌入到应用的方式来使用它,只需要在类路径加个类库就可以.实际上有多套 BI 解决方案都是通过集成 Mondrian 的方式来实现多维分析. 本文介绍编程方式连接 Mondrian,执行 MDX 查询的方法.使用 mondrian 需要有一个数据库的连接和多维数据的描述文件(Schema 文件).这个可以通过我之前的文章来了解. http://blog.csdn.net/qzp1991/article/details/44016959 http://

基于java的微信公众号二次开发视频教程

详情请交流  QQ  709639943 00.基于java的微信公众号二次开发视频教程 00.leetcode 算法 面试 00.北风网 零基础到数据(大数据)分析专家-首席分析师 00.快速上手JMeter 00.Jmeter 00.2017年Java web开发工程师成长之路 00.R语言速成实战 00.R语言数据分析实战 00.Python+Django+Ansible Playbook自动化运维项目实战 00.Java深入微服务原理改造房产销售平台 00.Python3入门机器学习 经