一、Quartz简介

Quartz是一个开放源码项目,专注于任务调度器,提供了极为广泛的特性如持久化任务,集群和分布式任务等。Spring对Quartz的集成与其对JDK Timer的集成在任务、触发器和调度计划的声明式配置方面等都非常相似。

Quartz的核心由两个接口和两个类组成:Job和Scheduler接口,JobDetail和Trigger类。不同于JDK
Timer,任务不是从实现一个Job接口的类实例开始运行,实际上Quartz在需要的时候才创建job类实例。可以使用JobDetail类来包装任
务状态,并传递一个信息给Job,或在一个Job的多次执行过程之间保存信息。

二、Quartz任务调度

1. 简单任务调度

在Quartz中创建一个任务并执行,只需要实现Job接口类,在其execute()方法中处理你的业务逻辑。下面举例说明。

HelloWorldJob.java

  1. package com.learnworld.quartz;
  2. import org.quartz.Job;
  3. import org.quartz.JobExecutionContext;
  4. import org.quartz.JobExecutionException;
  5. public class HelloWorldJob implements Job {
  6. public void execute(JobExecutionContext context) throws JobExecutionException {
  7. //实现你的业务逻辑
  8. System.out.println("Hello!");
  9. }
  10. }

HelloScheduling.java

  1. package com.learnworld.quartz;
  2. import java.util.Date;
  3. import org.quartz.JobDetail;
  4. import org.quartz.Scheduler;
  5. import org.quartz.SimpleTrigger;
  6. import org.quartz.Trigger;
  7. import org.quartz.impl.StdSchedulerFactory;
  8. public class HelloScheduling {
  9. public static void main(String[] args) throws Exception {
  10. Scheduler scheduler = new StdSchedulerFactory().getScheduler();
  11. scheduler.start();
  12. JobDetail jobDetail = new JobDetail("helloWorldJob",
  13. Scheduler.DEFAULT_GROUP, HelloWorldJob.class);
  14. Trigger trigger = new SimpleTrigger("simpleTrigger",
  15. Scheduler.DEFAULT_GROUP, new Date(), null,
  16. SimpleTrigger.REPEAT_INDEFINITELY, 1000);
  17. scheduler.scheduleJob(jobDetail, trigger);
  18. }
  19. }

需要说明几点:

1)开始使用StdSchedulerFactory来获取Scheduler的实例。每一个scheduler可以被启动(start)、中止
(stop)和暂停(pause)。如果一个scheduler没有被启动或已经被暂停,则没有触发器会被启用,所以首先使用start()方法启动
scheduler。

2)创建JobDetail实例。它的构造参数有三个,第一个是任务名,任务名可以被用作参数来应用需要暂停的任务;第二个是组名,组名可以用来引用一组被集合在一起的任务,这里采用缺省组名,每一个任务名在组内必须是唯一的;第三个参数是实现了特定任务的类。

3)创建Trigger实例。我们使用SimpleTrigger类,它提供了类似JDK
Timer风格的触发器行为。它的构造参数有六个,第一个和第二个为触发器名和组名,和上面类似;第三个为任务开始时间;第四个为结束时间,如果设置为
空,表示不存在结束时间;第五个为重复次数,允许你指的触发器被触发的最大次数,使用REPEAT_INDEFINITELY允许触发器可以被触发无限
次;第六个是触发器运行的时间间隔,是毫秒数。

4)最后通过scheduler.scheduleJob()方法调度任务。

2. 使用JobDetail传递数据

每个JobDetail实例都有关联的JobDataMap实例,它实现了Map接口并允许通过键值来传递任务相关的数据。任务也可以修改JobDataMap中的数据,在同一任务的多次执行之间传递数据。下面举例说明。

MessageJob.java

  1. package com.learnworld.quartz;
  2. import java.util.Map;
  3. import org.quartz.Job;
  4. import org.quartz.JobExecutionContext;
  5. import org.quartz.JobExecutionException;
  6. public class MessageJob implements Job {
  7. public void execute(JobExecutionContext context) throws JobExecutionException {
  8. Map properties = context.getJobDetail().getJobDataMap();
  9. System.out.println("Previous Fire Time: " + context.getPreviousFireTime());
  10. System.out.println("Current Fire Time: " + context.getFireTime());
  11. System.out.println("Next Fire Time: " + context.getNextFireTime());
  12. System.out.println(properties.get("message"));
  13. }
  14. }

MessageScheduling.java

  1. package com.learnworld.quartz;
  2. import java.util.Date;
  3. import java.util.Map;
  4. import org.quartz.JobDetail;
  5. import org.quartz.Scheduler;
  6. import org.quartz.SimpleTrigger;
  7. import org.quartz.Trigger;
  8. import org.quartz.impl.StdSchedulerFactory;
  9. public class MessageScheduling {
  10. public static void main(String[] args) throws Exception {
  11. Scheduler scheduler = new StdSchedulerFactory().getScheduler();
  12. scheduler.start();
  13. JobDetail jobDetail = new JobDetail("messageJob",
  14. Scheduler.DEFAULT_GROUP, MessageJob.class);
  15. Map map = jobDetail.getJobDataMap();
  16. map.put("message", "This is a message from Quartz");
  17. Trigger trigger = new SimpleTrigger("simpleTrigger",
  18. Scheduler.DEFAULT_GROUP, new Date(), new Date("Sat, 12 Aug 2011 13:30:00 GMT+0430"),
  19. SimpleTrigger.REPEAT_INDEFINITELY, 5000);
  20. scheduler.scheduleJob(jobDetail, trigger);
  21. }
  22. }

3. 使用CronTrigger

上面提到了SimpleTrigger类,它提供了类似JDK Timer风格的触发器功能。Quartz的出色在于它使用CronTrigger提供了对复杂触发器的支持。

一个CronTrigger表达式,包含六个必须组件和一个可选组件。关于cron表达式,可以参考这篇文档:http://www.quartz-scheduler.org/docs/tutorials/crontrigger.html

下面举例说明CronTrigger的使用。

CronWithCalendarScheduling.java

  1. package com.learnworld.quartz;
  2. import java.util.Calendar;
  3. import java.util.Date;
  4. import java.util.Map;
  5. import org.quartz.CronTrigger;
  6. import org.quartz.JobDetail;
  7. import org.quartz.Scheduler;
  8. import org.quartz.SimpleTrigger;
  9. import org.quartz.Trigger;
  10. import org.quartz.impl.StdSchedulerFactory;
  11. import org.quartz.impl.calendar.HolidayCalendar;
  12. public class CronWithCalendarScheduling {
  13. public static void main(String[] args) throws Exception {
  14. Calendar cal = Calendar.getInstance();
  15. cal.set(2010, Calendar.OCTOBER, 31);
  16. HolidayCalendar calendar  = new HolidayCalendar();
  17. calendar.addExcludedDate(cal.getTime());
  18. Scheduler scheduler = new StdSchedulerFactory().getScheduler();
  19. scheduler.start();
  20. scheduler.addCalendar("calendar", calendar, true, false);
  21. JobDetail jobDetail = new JobDetail("messageJob",
  22. Scheduler.DEFAULT_GROUP, MessageJob.class);
  23. Map map = jobDetail.getJobDataMap();
  24. map.put("message", "This is a message from Quartz");
  25. String cronExpression = "3/5 * 17,18,19,20 * * ?";
  26. Trigger trigger = new CronTrigger("cronTrigger",
  27. Scheduler.DEFAULT_GROUP, cronExpression);
  28. scheduler.scheduleJob(jobDetail, trigger);
  29. }
  30. }

需要说明几点:

1)创建了HolidayCalendar实例,使用addExcluderData()方法排除了2010年10月31日。再使用addCalendar()方法,将这个Calendar加入到Scheduler中。

2)这个cron表达式的含义是,每天17:00-20:59之间每一分钟的第三秒开始运行,每五秒执行一次。

三. Spring对Quartz调度的支持

Spring对Quartz集成与其对JDK Timer调度集成类似,你可以在配置文件中配置任务调度。仅需要在程序里加载ApplicationContext,Spring会自动启动调度器。

quartz.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
  3. <beans>
  4. <bean id="job"
  5. class="org.springframework.scheduling.quartz.JobDetailBean">
  6. <property name="jobClass">
  7. <value> com.learnworld.quartz.MessageJob </value>
  8. </property>
  9. <property name="jobDataAsMap">
  10. <map>
  11. <entry key="message">
  12. <value>This is a message from Spring Quartz configuration!</value>
  13. </entry>
  14. </map>
  15. </property>
  16. </bean>
  17. <bean id="trigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
  18. <property name="startDelay">
  19. <value>1000</value>
  20. </property>
  21. <property name="repeatInterval">
  22. <value>3000</value>
  23. </property>
  24. <property name="jobDetail">
  25. <ref local="job" />
  26. </property>
  27. </bean>
  28. <bean id="schdulerFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
  29. <property name="triggers">
  30. <list>
  31. <ref local="trigger" />
  32. </list>
  33. </property>
  34. </bean>
  35. </beans>

SimpleSpringQuartzIntegration.java

  1. package com.learnworld.quartz;
  2. import org.springframework.context.ApplicationContext;
  3. import org.springframework.context.support.FileSystemXmlApplicationContext;
  4. public class SimpleSpringQuartzIntegration {
  5. public static void main(String[] args) {
  6. ApplicationContext ac = new FileSystemXmlApplicationContext("src/conf/quartz.xml");
  7. }
  8. }

需要说明几点:

1)采用JobDetailBean类,它扩展了JobDetai类,采用可声明方式配置任务数据。缺省情况下,采用<bean>标签的id作为任务名,使用缺省组作为组名,通过jobDataAsMap作为配置任务数据。

2)建立触发器。可以选择SimpleTriggerBean或CronTriggerBean类。SimpleTriggerBean缺省情况下把可重复执行次数设为无限。

3)创建schedulerFactory。缺省情况下,SchedulerFactoryBean创建一个StdSchedulerFactory的实
例,后者创建Scheduler的实现。可以通过设置schedulerFactoryClass属性来覆盖这个行为,需要继承
SchedulerFactory接口来实现你自己的版本。

引入的jar包:

Quartz经典入门案列的更多相关文章

  1. Hadoop入门案列,初学者Coder

    1.WordCount Job类: package com.simope.mr.wcFor; import org.apache.hadoop.conf.Configuration; import o ...

  2. 初学spring之入门案列

    spring其实是一个很大的开源框架,而我学的就是spring framework,这只是spring其中的一小部分.有疑惑的可以去官网去看看,spring官网我就不提供了.一百度肯定有.和sprin ...

  3. Spring MVC的配置文件(XML)的几个经典案列

    1.既然是配置文件版的,那配置文件自然是必不可少,且应该会很复杂,那我们就以一个一个的来慢慢分析这些个经典案列吧! 01.实现Controller /* * 控制器 */ public class M ...

  4. js闭包的作用域以及闭包案列的介绍:

    转载▼ 标签: it   js闭包的作用域以及闭包案列的介绍:   首先我们根据前面的介绍来分析js闭包有什么作用,他会给我们编程带来什么好处? 闭包是为了更方便我们在处理js函数的时候会遇到以下的几 ...

  5. SAMSUNG某型号一千短信成功记录!对比其他软件恢复不成功的案列!

    Hello! 大家好欢迎再次来到Dr.wonde的博客, 下面谈一下今天的案列,今年11月26号收到了一客户寄来的三星S4手机恢复里面短信, 如下图所示,用其他软件恢复以后,数据为零,没有恢复,,这下 ...

  6. php知识案列分享

    今天再跟大家分享一下,以下案列. 使用array_flip函数生成随机数,可以去掉重复值. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 < ...

  7. linux下mysql函数的详细案列

    MYSQL * STDCALL mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *pas ...

  8. Jqgrid入门-Jqgrid列数据拖动(七)

    上一章提到在Jqgrid中如何设置二级表头,这一章节主要探讨Jqgrid表格里面的数据如果实现拖动功能,比如你想把第一行的数据拖到当前页的最后一行,或者其他位置.     Jqgrid表格插件自己没有 ...

  9. Quartz Sheduler 入门

    Quartz Sheduler 入门 原文地址:http://www.quartz-scheduler.org/generated/2.2.2/html/qtz-all/ 下载地址:http://qu ...

随机推荐

  1. GreenPlum 集群常用命令

    GreenPlum 常用命令 gpstate 命令 参数 作用 gpstate -b => 显示简要状态 gpstate -c => 显示主镜像映射 gpstart -d => 指定 ...

  2. IE下自定义错误页面不显示的原因

    如果一个 404 页面的内容小于 512B,IE 会认为该 404 页面不够友好,在 IE 下将不会成功返回该 404 错误页面

  3. Python中字符串操作函数string.split('str1')和string.join(ls)

    Python中的字符串操作函数split 和 join能够实现字符串和列表之间的简单转换, 使用 .split()可以将字符串中特定部分以多个字符的形式,存储成列表 def split(self, * ...

  4. 洛谷 P3227 BZOJ 3144 [HNOI2013]切糕

    题目描述 经过千辛万苦小 A 得到了一块切糕,切糕的形状是长方体,小 A 打算拦腰将切糕切成两半分给小 B.出于美观考虑,小 A 希望切面能尽量光滑且和谐.于是她找到你,希望你能帮她找出最好的切割方案 ...

  5. logstash-input-jdbc实现mysql 与elasticsearch实时同步(ES与关系型数据库同步)

    引言: elasticsearch 的出现使得我们的存储.检索数据更快捷.方便.但很多情况下,我们的需求是:现在的数据存储在mysql.oracle等关系型传统数据库中,如何尽量不改变原有数据库表结构 ...

  6. COCOS2D-X暂时设置竖屏,过一阵子再设置回横屏

    mainActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//竖屏 竖屏是JAVA代码 另外再改动C ...

  7. spring学习笔记(22)声明式事务配置,readOnly无效写无异常

    在上一节内容中.我们使用了编程式方法来配置事务,这种优点是我们对每一个方法的控制性非常强.比方我须要用到什么事务,在什么位置假设出现异常须要回滚等.能够进行非常细粒度的配置.但在实际开发中.我们可能并 ...

  8. JavaScript特效之前进,后退(返回上一级)

    在页面上增加前进,后退(返回上一级)功能: 方式一:使用函数 <script> function goback(){  history.go(-1);//返回或者history.back( ...

  9. hdu1829 A Bug&#39;s Life(并查集)

    开两个并查集.然后合并的时候要合并两次.这样在合并之前推断是否冲突,假设不冲突就进行合并,否则不须要继续合并. #include<cstdio> #include<cstdlib&g ...

  10. POJ2228 Naptime 环形DP

    题目大意:牛在第i个小时睡觉能够恢复U[i]点体力.睡觉时第一小时不恢复体力.一天的N小时连着下一天的1小时.求能够恢复体力的和的最大值. 定义DP[i][j][0]为前i个小时休息了j个小时,i小时 ...