pom文件
<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.akane.test</groupId>
<artifactId>test-quartz</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
<name>test-quartz</name>
<properties>
<springframework.version>4.0.6.RELEASE</springframework.version>
<quartz.version>2.2.1</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>
<!-- 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>
</dependencies>
</project>
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.akane.test.quartz"/>
<!--簡單任務:調度某個對象的某個方法,使用MethodInvokingJobDetailFactoryBean,
任務類能夠不實現Job接口,經過targetMethod指定調用方法-->
<bean id="simpleJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="testQuartz1"/>
<property name="targetMethod" value="testSimpleDetail"/>
<!--false表示等上一個任務執行完後再開啓新的任務-->
<property name="concurrent" value="false"/>
</bean>
<!--複雜任務:調度帶依賴對象的Job任務-->
<bean name="complexJobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<!--TestQuartz1繼承QuartzJobBean,實現了Job接口-->
<!--Quartz的默認JobFactory實如今job被實例化的時候會自動調用set方法將依賴對象注入-->
<property name="jobClass" value="com.akane.test.quartz.TestQuartz1"/>
<!--JobDataMap是Java Map接口的一個實現,能夠包含不限量的(序列化的)數據對象-->
<!--JobDataMap裏的數據能夠經過executeInternal函數的JobExecutionContext參數取出
就本例而言,Map裏的對象和經過set注入的對象實際上是同一個-->
<property name="jobDataMap">
<map>
<entry key="complexDetailInvoker" value-ref="complexDetailInvoker"/>
</map>
</property>
<!--若是一個job是非持久的,當沒有活躍的trigger與之關聯的時候,會被自動地從scheduler中刪除。
也就是說,非持久的job的生命期是由trigger的存在與否決定的-->
<property name="durability" value="true"/>
</bean>
<!--簡單觸發器: 延遲1秒啓動,每隔2秒執行一次,任務執行完要5秒,間隔2秒,不容許併發執行的狀況下會等任務執行完
再開啓下次任務-->
<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
<property name="jobDetail" ref="simpleJobDetail"/>
<!--延遲1秒啓動-->
<property name="startDelay" value="1000"/>
<!--每隔2秒執行一次-->
<property name="repeatInterval" value="2000"/>
</bean>
<!-- 帶cron表達書的觸發器:每隔5秒執行一次 -->
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="complexJobDetail"/>
<property name="cronExpression" value="0/5 * * * * ? "/>
</bean>
<!-- 調度器工廠bean經過jobdetail和trigger生成調度器 -->
<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>
</bean>
</beans>
測試類
@Component("testQuartz1")
public class TestQuartz1 extends QuartzJobBean {
//要注入的對象
private ComplexDetailInvoker complexDetailInvoker;
//必須提供set方法
public void setComplexDetailInvoker(ComplexDetailInvoker complexDetailInvoker) {
this.complexDetailInvoker = complexDetailInvoker;
}
//簡單任務直接執行
public void testSimpleDetail(){
for (int i = 1; i <=5 ; i++) {
System.out.println("simple quartz-test invoke "+i+" time");
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
//JobDataMap中獲取要執行的任務對象
ComplexDetailInvoker complexDetailInvoker = (ComplexDetailInvoker) context.getJobDetail().getJobDataMap().get("complexDetailInvoker");
complexDetailInvoker.testComplexDetail();
//經過set方法注入的任務對象
this.complexDetailInvoker.testComplexDetail();
//查看是不是同一個對象
System.out.println(complexDetailInvoker==this.complexDetailInvoker);
}
}
測試類依賴對象
@Component("complexDetailInvoker")
public class ComplexDetailInvoker {
public void testComplexDetail(){
System.out.println("complex quartz-test!");
}
}
測試啓動類
public class AppMain {
public static void main(String[] args) {
final ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("classpath:spring-quartz.xml");
}
}
測試結果
simple quartz-test invoke 5 time
simple quartz-test invoke 1 time
simple quartz-test invoke 2 time
simple quartz-test invoke 3 time
complex quartz-test!
complex quartz-test!
true
simple quartz-test invoke 4 time
simple quartz-test invoke 5 time
simple quartz-test invoke 1 time
complex quartz-test!
complex quartz-test!
true
simple quartz-test invoke 2 time
simple quartz-test invoke 3 time
simple quartz-test invoke 4 time
simple quartz-test invoke 5 time
simple quartz-test invoke 1 time
complex quartz-test!
complex quartz-test!
true
simple quartz-test invoke 2 time
simple quartz-test invoke 3 time
simple quartz-test invoke 4 time
simple quartz-test invoke 5 time
complex quartz-test!
complex quartz-test!
true
simple quartz-test invoke 1 time
simple quartz-test invoke 2 time
參考資料