版本:
- Spring版本:4.0.3
- Quartz版本:2.2.1
声明:
Quartz基础使用请参考“Quartz”一文,这里只记录并总结最新(2015年2月12日)、最全的Spring-quartz整合方案;因近期项目中有一个“接水”需求,而且需要注入service中的一些方法,之前也单独使用并记录过Quartz的基础使用方法,网络上相关文章的泛滥、版本老旧等问题普遍存在,所以在此做一个Spring整合Quartz的全面总结并拓展Quartz一文。
准备:
- Spring基础jar
- Quartz基础jar
- Spring-context-support-4.0.3.RELEASE(重要)
<!--自动扫包 --> <context:component-scan base-package="*"/> <!--启动AspectJ支持 --> <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
第一种实现:
- Java类:
SimpleJob就是普通java类。
- applicationContext.xml配置:
<!-- spring整合quartz--> <!-- jobDetail --> <bean id="simpleJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean" <span style="white-space:pre"> </span>p:targetObject-ref="simpleJob" p:targetMethod="executeInternal" p:concurrent="false"/> <!-- trigger --> <bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean" p:jobDetail-ref="simpleJobDetail" p:startDelay="0" p:repeatInterval="1000"> </bean>
第二种实现:
- Java类:
CronJob继承QuartzJobBean类并重写了executeInternal(JobExecutionContext context)方法。
- applicationContext.xml配置:
将job托管给spring:<bean name="cronJobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean" p:jobClass="crazyz.itfriday.utils.quartz.CronJob" p:durability="true"> <property name="jobDataAsMap"> <map> <entry key="refresh" value="60"/> </map> </property> </bean> <!-- trigger --> <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean" p:jobDetail-ref="cronJobDetail" p:cronExpression="0 0/1 * * * ? *" />
- Java类:
要实现spring注入需要修改jobFactory,因为job是在jobFactory中创建无法托管给spring所以需要复写相关创建方法:
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.Component; @Component(value="jobFactoryWrapper") public class JobFactoryWrapper extends AdaptableJobFactory { @Autowired private AutowireCapableBeanFactory capableBeanFactory; protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception { //调用父类的方法 Object jobInstance = super.createJobInstance(bundle); //进行注入,这属于Spring的技术,不清楚的可以查看Spring的API. capableBeanFactory.autowireBean(jobInstance); return jobInstance; } }
- applicationContext.xml配置(红色):
<!-- scheduler --> <bean id="springQuartzScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" p:jobFactory-ref="jobFactoryWrapper" autowire="no" lazy-init="true"> <property name="triggers"> <list> <ref bean="simpleTrigger"/> <ref bean="cronTrigger"/> </list> </property> </bean>
github地址:
https://github.com/710270532/spring-quartz