Quartz经典入门案列
一、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
- package com.learnworld.quartz;
- import org.quartz.Job;
- import org.quartz.JobExecutionContext;
- import org.quartz.JobExecutionException;
- public class HelloWorldJob implements Job {
- public void execute(JobExecutionContext context) throws JobExecutionException {
- //实现你的业务逻辑
- System.out.println("Hello!");
- }
- }
HelloScheduling.java
- package com.learnworld.quartz;
- import java.util.Date;
- import org.quartz.JobDetail;
- import org.quartz.Scheduler;
- import org.quartz.SimpleTrigger;
- import org.quartz.Trigger;
- import org.quartz.impl.StdSchedulerFactory;
- public class HelloScheduling {
- public static void main(String[] args) throws Exception {
- Scheduler scheduler = new StdSchedulerFactory().getScheduler();
- scheduler.start();
- JobDetail jobDetail = new JobDetail("helloWorldJob",
- Scheduler.DEFAULT_GROUP, HelloWorldJob.class);
- Trigger trigger = new SimpleTrigger("simpleTrigger",
- Scheduler.DEFAULT_GROUP, new Date(), null,
- SimpleTrigger.REPEAT_INDEFINITELY, 1000);
- scheduler.scheduleJob(jobDetail, trigger);
- }
- }
需要说明几点:
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
- package com.learnworld.quartz;
- import java.util.Map;
- import org.quartz.Job;
- import org.quartz.JobExecutionContext;
- import org.quartz.JobExecutionException;
- public class MessageJob implements Job {
- public void execute(JobExecutionContext context) throws JobExecutionException {
- Map properties = context.getJobDetail().getJobDataMap();
- System.out.println("Previous Fire Time: " + context.getPreviousFireTime());
- System.out.println("Current Fire Time: " + context.getFireTime());
- System.out.println("Next Fire Time: " + context.getNextFireTime());
- System.out.println(properties.get("message"));
- }
- }
MessageScheduling.java
- package com.learnworld.quartz;
- import java.util.Date;
- import java.util.Map;
- import org.quartz.JobDetail;
- import org.quartz.Scheduler;
- import org.quartz.SimpleTrigger;
- import org.quartz.Trigger;
- import org.quartz.impl.StdSchedulerFactory;
- public class MessageScheduling {
- public static void main(String[] args) throws Exception {
- Scheduler scheduler = new StdSchedulerFactory().getScheduler();
- scheduler.start();
- JobDetail jobDetail = new JobDetail("messageJob",
- Scheduler.DEFAULT_GROUP, MessageJob.class);
- Map map = jobDetail.getJobDataMap();
- map.put("message", "This is a message from Quartz");
- Trigger trigger = new SimpleTrigger("simpleTrigger",
- Scheduler.DEFAULT_GROUP, new Date(), new Date("Sat, 12 Aug 2011 13:30:00 GMT+0430"),
- SimpleTrigger.REPEAT_INDEFINITELY, 5000);
- scheduler.scheduleJob(jobDetail, trigger);
- }
- }
3. 使用CronTrigger
上面提到了SimpleTrigger类,它提供了类似JDK Timer风格的触发器功能。Quartz的出色在于它使用CronTrigger提供了对复杂触发器的支持。
一个CronTrigger表达式,包含六个必须组件和一个可选组件。关于cron表达式,可以参考这篇文档:http://www.quartz-scheduler.org/docs/tutorials/crontrigger.html
下面举例说明CronTrigger的使用。
CronWithCalendarScheduling.java
- package com.learnworld.quartz;
- import java.util.Calendar;
- import java.util.Date;
- import java.util.Map;
- import org.quartz.CronTrigger;
- import org.quartz.JobDetail;
- import org.quartz.Scheduler;
- import org.quartz.SimpleTrigger;
- import org.quartz.Trigger;
- import org.quartz.impl.StdSchedulerFactory;
- import org.quartz.impl.calendar.HolidayCalendar;
- public class CronWithCalendarScheduling {
- public static void main(String[] args) throws Exception {
- Calendar cal = Calendar.getInstance();
- cal.set(2010, Calendar.OCTOBER, 31);
- HolidayCalendar calendar = new HolidayCalendar();
- calendar.addExcludedDate(cal.getTime());
- Scheduler scheduler = new StdSchedulerFactory().getScheduler();
- scheduler.start();
- scheduler.addCalendar("calendar", calendar, true, false);
- JobDetail jobDetail = new JobDetail("messageJob",
- Scheduler.DEFAULT_GROUP, MessageJob.class);
- Map map = jobDetail.getJobDataMap();
- map.put("message", "This is a message from Quartz");
- String cronExpression = "3/5 * 17,18,19,20 * * ?";
- Trigger trigger = new CronTrigger("cronTrigger",
- Scheduler.DEFAULT_GROUP, cronExpression);
- scheduler.scheduleJob(jobDetail, trigger);
- }
- }
需要说明几点:
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
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
- <beans>
- <bean id="job"
- class="org.springframework.scheduling.quartz.JobDetailBean">
- <property name="jobClass">
- <value> com.learnworld.quartz.MessageJob </value>
- </property>
- <property name="jobDataAsMap">
- <map>
- <entry key="message">
- <value>This is a message from Spring Quartz configuration!</value>
- </entry>
- </map>
- </property>
- </bean>
- <bean id="trigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
- <property name="startDelay">
- <value>1000</value>
- </property>
- <property name="repeatInterval">
- <value>3000</value>
- </property>
- <property name="jobDetail">
- <ref local="job" />
- </property>
- </bean>
- <bean id="schdulerFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
- <property name="triggers">
- <list>
- <ref local="trigger" />
- </list>
- </property>
- </bean>
- </beans>
SimpleSpringQuartzIntegration.java
- package com.learnworld.quartz;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.FileSystemXmlApplicationContext;
- public class SimpleSpringQuartzIntegration {
- public static void main(String[] args) {
- ApplicationContext ac = new FileSystemXmlApplicationContext("src/conf/quartz.xml");
- }
- }
需要说明几点:
1)采用JobDetailBean类,它扩展了JobDetai类,采用可声明方式配置任务数据。缺省情况下,采用<bean>标签的id作为任务名,使用缺省组作为组名,通过jobDataAsMap作为配置任务数据。
2)建立触发器。可以选择SimpleTriggerBean或CronTriggerBean类。SimpleTriggerBean缺省情况下把可重复执行次数设为无限。
3)创建schedulerFactory。缺省情况下,SchedulerFactoryBean创建一个StdSchedulerFactory的实
例,后者创建Scheduler的实现。可以通过设置schedulerFactoryClass属性来覆盖这个行为,需要继承
SchedulerFactory接口来实现你自己的版本。
引入的jar包:
Quartz经典入门案列的更多相关文章
- Hadoop入门案列,初学者Coder
1.WordCount Job类: package com.simope.mr.wcFor; import org.apache.hadoop.conf.Configuration; import o ...
- 初学spring之入门案列
spring其实是一个很大的开源框架,而我学的就是spring framework,这只是spring其中的一小部分.有疑惑的可以去官网去看看,spring官网我就不提供了.一百度肯定有.和sprin ...
- Spring MVC的配置文件(XML)的几个经典案列
1.既然是配置文件版的,那配置文件自然是必不可少,且应该会很复杂,那我们就以一个一个的来慢慢分析这些个经典案列吧! 01.实现Controller /* * 控制器 */ public class M ...
- js闭包的作用域以及闭包案列的介绍:
转载▼ 标签: it js闭包的作用域以及闭包案列的介绍: 首先我们根据前面的介绍来分析js闭包有什么作用,他会给我们编程带来什么好处? 闭包是为了更方便我们在处理js函数的时候会遇到以下的几 ...
- SAMSUNG某型号一千短信成功记录!对比其他软件恢复不成功的案列!
Hello! 大家好欢迎再次来到Dr.wonde的博客, 下面谈一下今天的案列,今年11月26号收到了一客户寄来的三星S4手机恢复里面短信, 如下图所示,用其他软件恢复以后,数据为零,没有恢复,,这下 ...
- php知识案列分享
今天再跟大家分享一下,以下案列. 使用array_flip函数生成随机数,可以去掉重复值. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 < ...
- linux下mysql函数的详细案列
MYSQL * STDCALL mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *pas ...
- Jqgrid入门-Jqgrid列数据拖动(七)
上一章提到在Jqgrid中如何设置二级表头,这一章节主要探讨Jqgrid表格里面的数据如果实现拖动功能,比如你想把第一行的数据拖到当前页的最后一行,或者其他位置. Jqgrid表格插件自己没有 ...
- Quartz Sheduler 入门
Quartz Sheduler 入门 原文地址:http://www.quartz-scheduler.org/generated/2.2.2/html/qtz-all/ 下载地址:http://qu ...
随机推荐
- 编码的由来,ASCII编码,和字节的形成
一.编码的由来 计算机只能计算和识别二进制,必须让计算机识别文字,才能和计算机进行交互,彼此也才能通过计算机通信. 由此,有了ASCII编码的诞生,它起始于50年代后期,在1967年定案,是最初美国国 ...
- django异常--数据库同步
在新创建的Django项目中执行makemigrations时,遇到: 而仔细观察,这个报错的app名字是我们之前项目中的app名字,但现在却在我们当前的项目中报错了.究其原因,则是因为之前的项目中的 ...
- 一次获取多个oracle序列值
一次获取多个oracle序列值 学习了:http://blog.csdn.net/wangchsh2008/article/details/53495961 select seq_one.nextva ...
- 在Linux中samba server的配置
1.查看是否安装samba服务 # rpm –qa |grep samba 2.若没安装,则安 # yum install samba 执行4次此命令 3.查看安装的samba文件 #rpm–qa | ...
- Android之旅十六 android中各种资源的使用
android中各种资源的使用: 在android开发中,各种资源的合理使用应该在各自的xml中进行定义,以便反复使用; 字符串资源:strings.xml,xml中引用:@string/XXX,ja ...
- 软件project师周兆熊给IT学子的倾情奉献
[来信] 贺老师: 你好,我是中兴通讯的一名软件开发project师,名叫周兆熊. 近期看了您的新书<逆袭大学:传给IT学子的正能量>,感觉你真心为当代学子答疑解惑.非常值得敬佩! 从上大 ...
- [JXOI 2018] 游戏 解题报告 (组合数+埃氏筛)
interlinkage: https://www.luogu.org/problemnew/show/P4562 description: solution: 注意到$l=1$的时候,$t(p)$就 ...
- Linux Shell Scripting Cookbook 读书笔记 2
cat,script,find, xargs, tr, tmp文件,字符串截取,批量文件重命名,固定大小文件,自动化交互 1. cat的用法 压缩连续的空白行 cat -s file 也可以用tr,将 ...
- MAVEN 杂记
MAVEN中央仓库 http://repo.maven.apache.org/maven2http://repo1.maven.org/maven2/http://mvnrepository.com/ ...
- 软件需求规范说明 (Software Requirements Specification, 简称SRS)
GB/T 9385-2008 笔记 为了形成确定和完备的规格说明, 我们需要明确 软件的顾客希望得到什么; 软件的供方理解用户想要什么; 4.2 SRS的基本性质 SRS是对在具体环境中执行确定功能的 ...