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
参考资料