您的位置:首页 > 编程语言 > Java开发

spring整合quartz实现定时任务

2016-03-01 15:06 477 查看

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


参考资料

Spring 4 + Quartz Scheduler Integration Example

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  quartz