Quartz学习笔记(二) 转自 learnworld 之 spring任务调度方法之Quartz (推荐)
2013-12-06 10:42
591 查看
一、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
HelloScheduling.java
需要说明几点:
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
MessageScheduling.java
3. 使用CronTrigger
上面提到了SimpleTrigger类,它提供了类似JDK Timer风格的触发器功能。Quartz的出色在于它使用CronTrigger提供了对复杂触发器的支持。
一个CronTrigger表达式,包含六个必须组件和一个可选组件。关于cron表达式,可以参考这篇文档:http://www.quartz-scheduler.org/docs/tutorials/crontrigger.html
下面举例说明CronTrigger的使用。
CronWithCalendarScheduling.java
需要说明几点:
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
SimpleSpringQuartzIntegration.java
需要说明几点:
1)采用JobDetailBean类,它扩展了JobDetai类,采用可声明方式配置任务数据。缺省情况下,采用<bean>标签的id作为任务名,使用缺省组作为组名,通过jobDataAsMap作为配置任务数据。
2)建立触发器。可以选择SimpleTriggerBean或CronTriggerBean类。SimpleTriggerBean缺省情况下把可重复执行次数设为无限。
3)创建schedulerFactory。缺省情况下,SchedulerFactoryBean创建一个StdSchedulerFactory的实例,后者创建Scheduler的实现。可以通过设置schedulerFactoryClass属性来覆盖这个行为,需要继承SchedulerFactory接口来实现你自己的版本。
===============另附一评论========================
建议大家看看bbossgroups中所带的quartz任务调度器,也比较好用哩
任务管理配置文件
一个简单的配置文件
/bbossaop/resources/org/frameworkset/task/quarts-task.xml的内容如下:
说明:
org.frameworkset.task.DefaultScheduleService是系统中默认提供的任务管理组件,用来加载系统中默认的静态的任务,可以配置多个,例如:
属性说明:
Taskid:用来区分任务组,可以作为任务组的唯一标识,系统中通过Taskid和jobid来区分唯一的一个作业任务,TaskService组件的很多方法中都有groupid和jobname两个参数,taskid就对应于groupid参数,jobid对应于 jobname参数。
Name 任务的名称
Jobid 任务的标识
Action任务执行的操作
cronb_time 任务执行的调度时间,具体需要参考cronb_time的语法。
use:区分任务是否生效
内嵌的节点
<map>
<property name="send_count" value="2" />
</map>
用来指定任务执行时需要的参数。
需要特别说明的是Action类必须实现org.frameworkset.task.Execute接口,例如:
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接口来实现你自己的版本。
===============另附一评论========================
建议大家看看bbossgroups中所带的quartz任务调度器,也比较好用哩
任务管理配置文件
一个简单的配置文件
/bbossaop/resources/org/frameworkset/task/quarts-task.xml的内容如下:
<properties> <property name="taskconfig" enable="true"> <list> <property name="定时任务执行器" taskid="default" class="org.frameworkset.task.DefaultScheduleService" used="true"> <!-- 可执行的任务项 属性说明: name:任务项名称 id:任务项标识 action:具体的任务执行处理程序,实现org.frameworkset.task.Execute接口 cron_time: cron格式的时间表达式,用来管理任务执行的生命周期,相关的规则请参照日期管理控件quartz的说明文档 used 是否使用 true 加载,缺省值 false 不加载 子元素说明: Map 和property:设置任务执行的参数,name标识参数名称,value指定参数的值 --> <list> <property name="workbroker" jobid="workbroker" class="org.frameworkset.task.TestJob" cronb_time="0 56 14 * * ?" used="true"> <map> <property name="send_count" value="2" /> </map> </property> </list> </property> </list> </property> </properties>
说明:
org.frameworkset.task.DefaultScheduleService是系统中默认提供的任务管理组件,用来加载系统中默认的静态的任务,可以配置多个,例如:
<property name="workbroker" jobid="workbroker" action="org.frameworkset.task.TestJob" cronb_time="0 56 14 * * ?" used="true"> <map> <property name="send_count" value="2" /> </map> </property>
属性说明:
Taskid:用来区分任务组,可以作为任务组的唯一标识,系统中通过Taskid和jobid来区分唯一的一个作业任务,TaskService组件的很多方法中都有groupid和jobname两个参数,taskid就对应于groupid参数,jobid对应于 jobname参数。
Name 任务的名称
Jobid 任务的标识
Action任务执行的操作
cronb_time 任务执行的调度时间,具体需要参考cronb_time的语法。
use:区分任务是否生效
内嵌的节点
<map>
<property name="send_count" value="2" />
</map>
用来指定任务执行时需要的参数。
需要特别说明的是Action类必须实现org.frameworkset.task.Execute接口,例如:
public class TestJob implements Execute, Serializable { public void execute(Map parameters) { System.out.println("send_count = "+parameters.get("send_count")); } }
相关文章推荐
- spring学习笔记spring整合Quartz持久化稳健任务调度(2)
- Spring 整合 Quartz 任务调度框架学习笔记
- spring学习笔记(26)spring整合Quartz2持久化稳健任务调度
- spring学习笔记(25)spring整合quartz多版本实现企业级任务调度
- Spring 4.3.5 配置 quartz 2.2.1 任务调度遇到的问题和解决方法
- 推荐一款Java基于最新Spring 4.2.5 集成Quartz 2.2.2 任务调度定时器界面配置版
- Quartz.NET 2.0 学习笔记(3) :通过配置文件实现任务调度
- Quartz.NET 2.0 学习笔记(5) :实例创建Windows服务实现任务调度
- 作业调度框架 Quartz 学习笔记(五) -- 错过的任务怎么办?
- 作业调度框架 Quartz 学习笔记(五) -- 错过的任务怎么办?
- 任务调度框架Quartz学习笔记—概述及第一个例子
- 推荐一款Java基于最新Spring 4.2.5 集成Quartz 2.2.2 任务调度定时器界面配置版
- spring 任务调度(quartz)使用方法
- 作业调度框架 Quartz 学习笔记(五) -- 错过的任务怎么办?
- Quartz.NET 2.0 学习笔记(3) :通过配置文件实现任务调度
- Spring整合Quartz实现定时任务调度的方法
- spring学习笔记--quartz和定时任务执行
- 作业调度框架 Quartz 学习笔记(五) -- 错过的任务怎么办?
- [置顶] Spring研磨分析、Quartz任务调度、Hibernate深入浅出系列文章笔记汇总
- Quartz.NET 2.0 学习笔记(5) :实例创建Windows服务实现任务调度