一、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接口来实现你自己的版本。
分享到:
相关推荐
Spring整合任务调度框架Quartz,本文档详细介绍了Spring整合任务调度框架Quartz,希望可以帮助学习者
spring任务调度(Quartz )非常基础,
Spring实现任务调度.ppt Spring实现任务调度_代码演示 quartz-all-1.6.1.jar
Spring Quartz 任务调度实例 可直接运行 可应用服务器启动调用 也可main入口调用 主要用于打jar包用
TimeTask 与quartz简单用法 Spring中任务调度cronExpression配置说明
Spring+Quartz实现任务调度的小例子.本来不要资源分的,可是CSDN发布资源最低要求填写分值为1分,没办法了。
Spring实现任务调度.ppt Spring实现任务调度_代码演示 quartz-all-1.6.1.jar
spring整合quartz定时任务调度..........
里面包含了两个工程项目: 1.Java project工程(含jar包,JDK1.6)。 是spring+quartz的任务调度实例。 2.Java web工程(含jar包,JDK1.7)。 spring+mybatis+quartz任务调度实例
该资源描述了用spring+quartz搭建的环境来管理任务调度的基本配置
spring+quartz任务调度代码版
3、调度中心HA(中心式):调度采用中心式设计,“调度中心”基于集群Quartz实现,可保证调度中心HA; 4、执行器HA(分布式):任务分布式执行,任务"执行器"支持集群部署,可保证任务执行HA; 5、任务Failover:...
quartz自动调度的3种调度形式+传参 1.单纯的quartz调度 2.spring+quartz调度
Quartz 是个开源的作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制。Quartz框架包含了调度器监听、作业和触发器监听。你可以配置作业和触发器监听为全局监听或者是特定于作业和触发器的监听...
spring quartz 时间任务调度框架 spring quartz 时间任务调度框架 spring quartz 时间任务调度框架
Spring任务调度的几种实现方法,包括持续运行某个方法,固定某个时间点运行
实现了spring配置比较流行的任务调度操作,java timer 和 quartz俩种方式 并且有注释描述。
Quartz + spring简单配置多个任务调度 spring配置文件 简单配置
Spring Quartz 定时调度任务,带中文注解与jar文件,导入项目即可直接运行。
spring quartz java任务调度 完整 可执行