前面一篇文章介绍了 Quartz的简单用法,Spring提供了一些类来简化Quartz的使用。本篇文章将介绍如何在Spring中集成Quartz。
涉及的开发工具与技术
- Spring 4.2.4.RELEASE
- Quartz 2.2.2
- Maven 3
- JDK 1.7
- Eclipse JUNO
Project目录结构
Eclipse Maven Project最终目录结构如下:
集成流程
下面将详细讲解集成的每一个细节
1、Maven 依赖配置
<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>com.ricky.quartz</groupId>
<artifactId>integrity</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>integrity</name>
<url>http://maven.apache.org</url>
<properties>
<quartz.version>2.2.2</quartz.version>
<springframework.version>4.2.4.RELEASE</springframework.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</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>
<!-- Transaction dependency is required with Quartz integration -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${springframework.version}</version>
</dependency>
<!-- Quartz framework -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>${quartz.version}</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.13</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
2、配置Quartz Job
在Spring中有两种方法配置Quartz Job
1) 使用 MethodInvokingJobDetailFactoryBean
<bean id="simpleJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="simpleBean" />
<property name="targetMethod" value="printMessage" />
</bean>
- 1
- 2
- 3
- 4
非常简便,只需要指定一个bean以及需要被执行的方法。
2)使用 JobDetailFactoryBean
<bean name="complexJobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="jobClass" value="com.ricky.quartz.integrity.complex.ComplexScheduledJob" />
<property name="jobDataMap">
<map>
<entry key="complexBean" value-ref="complexBean" />
</map>
</property>
<property name="durability" value="true" />
</bean>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
其中,jobClass需要指定一个 QuartzJobBean的子类(extends QuartzJobBean),jobDataMap 可以向jobClass指定的Job bean 传参数。
下面是jobClass 的指定的 QuartzJobBean 实现类
package com.ricky.quartz.integrity.complex;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;
public class ComplexScheduledJob extends QuartzJobBean {
private ComplexBean complexBean;
@Override
protected void executeInternal(JobExecutionContext context)
throws JobExecutionException {
complexBean.printMessage();
}
public void setComplexBean(ComplexBean complexBean) {
this.complexBean = complexBean;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
3、配置Quartz Trigger
Trigger是来定义scheduler何时执行你的job,有两种配置方式
1)Simple Trigger , 使用 SimpleTriggerFactoryBean配置
<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
<property name="jobDetail" ref="simpleJobDetail" />
<property name="startDelay" value="1000" />
<property name="repeatInterval" value="2000" />
<property name="repeatCount" value="5" />
</bean>
- 1
- 2
- 3
- 4
- 5
- 6
2)Cron Trigger , 使用 CronTriggerFactoryBean配置
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="complexJobDetail" />
<property name="cronExpression" value="0/5 * * * * ?" />
</bean>
- 1
- 2
- 3
- 4
4、配置 SchedulerFactoryBean
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="jobDetails">
<list>
<ref bean="simpleJobDetail" />
<ref bean="complexJobDetail" />
</list>
</property>
<property name="triggers">
<list>
<ref bean="simpleTrigger" />
<ref bean="cronTrigger" />
</list>
</property>
<property name="configLocation" value="classpath:quartz.properties" />
</bean>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
quartz-context.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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<context:component-scan base-package="com.ricky.quartz.integrity" />
<bean id="simpleJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="simpleBean" />
<property name="targetMethod" value="printMessage" />
</bean>
<bean name="complexJobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="jobClass" value="com.ricky.quartz.integrity.complex.ComplexScheduledJob" />
<property name="jobDataMap">
<map>
<entry key="complexBean" value-ref="complexBean" />
</map>
</property>
<property name="durability" value="true" />
</bean>
<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
<property name="jobDetail" ref="simpleJobDetail" />
<property name="startDelay" value="1000" />
<property name="repeatInterval" value="2000" />
<property name="repeatCount" value="5" />
</bean>
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="complexJobDetail" />
<property name="cronExpression" value="0/5 * * * * ?" />
</bean>
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="jobDetails">
<list>
<ref bean="simpleJobDetail" />
<ref bean="complexJobDetail" />
</list>
</property>
<property name="triggers">
<list>
<ref bean="simpleTrigger" />
<ref bean="cronTrigger" />
</list>
</property>
<property name="configLocation" value="classpath:quartz.properties" />
</bean>
</beans>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
5、simple POJO’s Task Beans
com.ricky.quartz.integrity.simple.SimpleBean
package com.ricky.quartz.integrity.simple;
import java.util.Date;
import org.springframework.stereotype.Component;
@Component
public class SimpleBean {
public void printMessage() {
System.out.println("simple task invoked by using SimpleTriggerFactoryBean"+new Date());
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
com.ricky.quartz.integrity.complex.ComplexBean
package com.ricky.quartz.integrity.complex;
import java.util.Date;
import org.springframework.stereotype.Component;
@Component
public class ComplexBean {
public void printMessage(){
System.out.println("complex task invoked by using CronTriggerFactoryBean"+new Date());
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
6、启动Spring容器
package com.ricky.quartz.integrity;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* Spring Quartz integration example
*
*/
public class App {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("quartz-context.xml");
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
运行结果如下:
complex task invoked by using CronTriggerFactoryBeanTue Jan 05 19:32:05 CST 2016
simple task invoked by using SimpleTriggerFactoryBeanTue Jan 05 19:32:05 CST 2016
simple task invoked by using SimpleTriggerFactoryBeanTue Jan 05 19:32:07 CST 2016
simple task invoked by using SimpleTriggerFactoryBeanTue Jan 05 19:32:09 CST 2016
complex task invoked by using CronTriggerFactoryBeanTue Jan 05 19:32:10 CST 2016
simple task invoked by using SimpleTriggerFactoryBeanTue Jan 05 19:32:11 CST 2016
simple task invoked by using SimpleTriggerFactoryBeanTue Jan 05 19:32:13 CST 2016
complex task invoked by using CronTriggerFactoryBeanTue Jan 05 19:32:15 CST 2016
simple task invoked by using SimpleTriggerFactoryBeanTue Jan 05 19:32:15 CST 2016
complex task invoked by using CronTriggerFactoryBeanTue Jan 05 19:32:20 CST 2016
Demo 源码github地址:https://github.com/FBing/Spring-Quartz–Integration