Spring4實戰(二)-Quartz 2.2 整合
前面一篇文章介紹了 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