本文将演示如何通过 Spring 使用 Quartz Scheduler 进行任务调度。Spring 为简化 Quartz 的操作提供了相关支持类。
本文示例使用的相关工具如下:
-
Spring 4.2.2 (发布于 2015 年 10 月)
-
Quartz Scheduler 2.2.2 (发布于 2015 年 10 月)
-
Maven 3
-
JDK 1.7
-
Eclipse Luna Service Release 1 (4.4.1)
步骤 1:新建 Maven 项目

这一步如果不知道怎么做可以参考博客《
使用 Eclipse 的 Maven 2 插件开发一个 JEE 项目》。
步骤 2:第三方依赖包的引入
Maven pom.xml 编辑如下:
-
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-
<modelVersion>4.0.0</modelVersion>
-
-
<groupId>settle</groupId>
-
<artifactId>spring-quartz</artifactId>
-
<version>1.0.0</version>
-
<packaging>jar</packaging>
-
<name>spring-quartz</name>
-
<url>http://maven.apache.org</url>
-
-
<properties>
-
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-
<springframework.version>4.2.2.RELEASE</springframework.version>
-
<quartz.version>2.2.2</quartz.version>
-
</properties>
-
-
<dependencies>
-
<dependency>
-
<groupId>org.springframework</groupId>
-
<artifactId>spring-core</artifactId>
-
<version>${springframework.version}</version>
-
</dependency>
-
<dependency>
-
<groupId>org.springframework</groupId>
-
<artifactId>spring-context-support</artifactId>
-
<version>${springframework.version}</version>
-
</dependency>
-
-
<dependency>
-
<groupId>org.springframework</groupId>
-
<artifactId>spring-tx</artifactId>
-
<version>${springframework.version}</version>
-
</dependency>
-
-
-
<dependency>
-
<groupId>org.quartz-scheduler</groupId>
-
<artifactId>quartz</artifactId>
-
<version>${quartz.version}</version>
-
</dependency>
-
</dependencies>
-
</project>
步骤 3:Quartz Scheduler 配置作业
有两种方式在 Spring 中使用 Quartz 来配置一个作业。
A:使用 MethodInvokingJobDetailFactoryBean
这种方式在你想要调用特定 bean 的一个方法的时候很是方便,比另一种方法要简单的多。
-
-
<bean id="simpleJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
-
<property name="targetObject" ref="myBean" />
-
<property name="targetMethod" value="printMessage" />
-
</bean>
以上作业配置简单调用了
myBean 的
printMessage 方法,
myBean 是一个简单的 POJO。
B:使用 JobDetailFactoryBean
如果你需要更高级的设置,需要给作业传递数据,想更加灵活的话就使用这种方式。
-
-
<bean name="firstComplexJobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
-
<property name="jobClass" value="com.defonds.scheduler.jobs.FirstScheduledJob" />
-
<property name="jobDataMap">
-
<map>
-
<entry key="anotherBean" value-ref="anotherBean" />
-
</map>
-
</property>
-
<property name="durability" value="true" />
-
</bean>
jobClass 关联到一个继承自
QuartzJobBean 的类,它实现了 Quartz 作业接口。调用到这个作业的时候,它的
executeInternal 将被执行。
jobDataMap 允许我们给相关作业 bean 传递一些数据。在这个例子里,我们将 ScheduledJob 将要使用到的 \'anotherBean\' 传递给它。
以下是引用 jobclass(
FirstScheduledJob)的具体实现。
com.defonds.scheduler.jobs.FirstScheduledJob
-
-
-
-
-
-
-
-
package com.defonds.scheduler.jobs;
-
-
import org.quartz.JobExecutionContext;
-
import org.quartz.JobExecutionException;
-
import org.springframework.scheduling.quartz.QuartzJobBean;
-
-
import com.defonds.scheduler.util.AnotherBean;
-
-
-
-
-
-
-
-
-
-
-
-
public class FirstScheduledJob extends QuartzJobBean {
-
-
private AnotherBean anotherBean;
-
-
@Override
-
protected void executeInternal(JobExecutionContext arg0)
-
throws JobExecutionException {
-
System.out.println("I am FirstScheduledJob");
-
this.anotherBean.printAnotherMessage();
-
-
}
-
-
public void setAnotherBean(AnotherBean anotherBean) {
-
this.anotherBean = anotherBean;
-
}
-
}
步骤 4:配置 Quartz 调度时要使用到的触发器
触发器用来定义调度器何时将会执行你的调度任务的那个时间。有两种可能的触发器类型:
A:简单触发器,使用 SimpleTriggerFactoryBean
你可以定义作业的启动时间、触发器之间的延迟时间以及 repeatInterval(频率)。
-
-
<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
-
<property name="jobDetail" ref="simpleJobDetail" />
-
<property name="startDelay" value="1000" />
-
<property name="repeatInterval" value="2000" />
-
</bean>
B:计划触发器,使用 CronTriggerFactoryBean
这种类型更加灵活,允许你针对特定实例选择计划方案以及将来要执行的频率。