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
相关文章推荐
- Spring整合Quartz(JobDetailBean方式)
- Spring整合Quartz(JobDetailBean方式)
- 最流行的java后台框架spring quartz定时任务
- java定时调度器(Quartz)使用实例
- quartz实现定时功能实例详解(servlet定时器配置方法)
- Spring3.2.0和Quartz1.8.6集群配置
- JFinal 整合Quartz
- JFinal Quartz 支持配置文件和持久化
- <我的备忘录> quartz在Play中的简单使用
- Quartz 任务调度(一)
- Quartz 任务调度(二)
- quartz的简单实现
- jfinal-quartz 使用jfinal启动quartz执行定时任务
- Quartz定时调度时间配置格式说明与实例
- UIKit框架(17)Quartz2D
- spring任务实时调度的几个方法
- Quartz Core 图层编程
- 关于Quartz的配置
- spirng-quartz定时任务简单实用
- iOS开发 — Quartz 2D基本使用