Spring本身提供了与Quartz集成的功能,需要引入Spring上下文支持模块,即spring-context-support,还需引入事务支持模块,即spring-tx,还有Quartz的包,即quartz和quartz-jobs。如下:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.23</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>2.2.1</version>
</dependency>
之后需要在Spring上下文中引入要管理的Quartz Bean,如例:
QuartzScheduler.xml文件中
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd">
<!-- 创建JobDetail实例的工厂Bean -->
<bean name="exampleJob"
class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="jobClass" value="com.rock.mySpring.quartz.ExampleJob" />
<property name="jobDataAsMap">
<map>
<entry key="timeout" value="5" />
</map>
</property>
</bean>
<bean id="exampleBusinessObject" class="com.rock.mySpring.quartz.ExampleBusinessObject" />
<!-- 示出一个JobDetail对象,代理执行目标对象的目标方法 -->
<bean id="jobDetail"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="exampleBusinessObject" />
<property name="targetMethod" value="doIt" />
<!-- 设置job非并发执行 -->
<!-- <property name="concurrent" value="false" /> -->
</bean>
<!-- 创建SimpleTrigger触发器的工厂Bean -->
<bean id="simpleTrigger"
class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
<!-- see the example of method invoking job above -->
<property name="jobDetail" ref="jobDetail" />
<!-- 延迟5秒执行 -->
<property name="startDelay" value="5000" />
<!-- 每5秒执行一次 -->
<property name="repeatInterval" value="5000" />
</bean>
<!-- 创建CronTrigger触发器的工厂Bean -->
<bean id="cronTrigger"
class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="exampleJob" />
<!-- 50秒后开始,每3秒执行一次 -->
<property name="cronExpression" value="5/1 * * * * ? " />
</bean>
<!-- 定义调度器,属性是触发器 -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="cronTrigger" />
<ref bean="simpleTrigger" />
</list>
</property>
</bean>
</beans>
相关的类:
ExampleJob.java
package com.rock.mySpring.quartz;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;
public class ExampleJob extends QuartzJobBean {
private int timeout;
/**
* Setter called after the ExampleJob is instantiated
* with the value from the JobDetailFactoryBean (5)
*/
public void setTimeout(int timeout) {
this.timeout = timeout;
}
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
System.out.println("timeout = " + timeout);
}
}
ExampleBusinessObject.java
package com.rock.mySpring.quartz;
public class ExampleBusinessObject {
// properties and collaborators
public void doIt() {
// do the actual work
System.out.println("ExampleBusinessObject.doIt");
}
}
之后,如果是spring应用,就直接加载Spring上下文配置文件,此时定时器Quartz任务就会自动触发;如果是整合Spring的web应用,则将QuartzScheduler.xml文件引入到Spring应用上下文中,即contextConfigLocation参数中(非单个Servlet的参数),则Web应用启动后就会触发定时器Quartz任务。