Quartz就是定时调度任务的框架,开发中我们基于maven来导入相应的jar包,
Spring整合quartz的job不会被spring管理,需要编写一个jobFactory来完成job的注入.
spring整合quartz框架实现定时任务的完成.
包结构
1.maven的依赖
<dependencies> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.2.1</version> </dependency> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz-jobs</artifactId> <version>2.2.1</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.12</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.1.7.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>4.1.7.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>4.1.7.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>4.1.7.RELEASE</version> </dependency> </dependencies>
2.applicationContext.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.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd "> <context:component-scan base-package="com.quartz.service"></context:component-scan> <!-- job --> <!-- jobclass不是被spring管理的类,无法注入的问题,如要自己创建一个jobfactory来实现bean的注入wen --> <bean id="helloJob" class="org.springframework.scheduling.quartz.JobDetailFactoryBean"> <property name="jobClass" value="com.quartz.job.HelloJob" /> </bean> <!-- trigger --> <bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean"> <property name="jobDetail" ref="helloJob" /> <!-- 3秒后第一次执行 --> <property name="startDelay" value="3000" /> <!-- 5秒后重复执行 --> <property name="repeatInterval" value="5000" /> </bean> <!-- scheduler --> <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="jobFactory" ref="jobFactory" /> <property name="triggers"> <list> <ref bean="simpleTrigger"/> </list> </property> </bean> </beans>
3.编写任务job
package com.quartz.job; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.springframework.beans.factory.annotation.Autowired; import com.quartz.service.HelloService; public class HelloJob implements Job{ @Autowired private HelloService helloService; public void execute(JobExecutionContext context) throws JobExecutionException { helloService.SayHello(); } }
4.编写定时任务和jobFactory
package com.quartz.service; import org.springframework.stereotype.Service; @Service public class HelloService { public void SayHello() { System.out.println("hello,quartz spring !!!~~"); } }
5.jobFactory的编写
package com.quartz.service; import org.quartz.spi.TriggerFiredBundle; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.AutowireCapableBeanFactory; import org.springframework.scheduling.quartz.AdaptableJobFactory; import org.springframework.stereotype.Service; @Service("jobFactory") public class JobFactory extends AdaptableJobFactory { @Autowired private AutowireCapableBeanFactory capableBeanFactory; @Override protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception { Object jobInstance = super.createJobInstance(bundle); capableBeanFactory.autowireBean(jobInstance); return jobInstance; } }