Spring集成Quartz实战
1、 为什么要在spring中集成Quartz
Quartz是可以单独工作的,可以通过实现job接口等方法来实现,这些方法在quartz官方example中都有,但是这样使用有一个弊端,那就是如果你的job/task中需要使用spring的bean,这样就惨了。
首先,quartz是独自实例化job的对象的,这个对象并不能被spring管理,所以它就无法通过依赖注入的方式注入spring bean。
其次,由于job是定时调度的,并没有servletrequest等web应用上下文,所以你还是没办法获取bean。
最后,你可以通过ApplicationContext acx = new ClassPathXmlApplicationContext("ApplicationContext.xml"); 通过acx获取serviceBean,这样的确能获取到bean,但是这样会导致容器中的bean翻倍,必须谨慎使用,否则可能造成各种问题,案例如下:
http://blog.csdn.net/glgl2424/article/details/22789961
所以,当你的web工程是基于spring搭建时,建议将quartz集成到spring中,方便使用。
2 准备工作
版本:quartz-1.5.1.jar 、spring3.0
3 配置方式
<!-- 总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序 -->
<bean id="startQuertz" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="issueDtsUpdateJobTime"/> <!-- 所有trigger都在此处列出,基本是每个job对应一个trigger -->
</list>
</property>
</bean>
<!-- 定义触发时间 -->
<bean id="issueDtsUpdateJobTime" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<ref bean="issueDtsUpdateJobTask"/>
</property>
<!-- cron表达式 -->
<property name="cronExpression">
<!-- 每隔10秒执行一次-->
<value>* * 0,1 * * ?</value>
</property>
</bean>
<!-- 定义任务,指定处理类和方法 -->
<bean id="issueDtsUpdateJobTask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject"><!-- 调用的类 -->
<ref bean="issueDtsUpdateJob"/>
</property>
<property name="targetMethod"> <!-- 调用类中的方法 -->
<value>updateAuto</value>
</property>
</bean>
<!-- 要调用的工作类 -->
<bean id="issueDtsUpdateJob" class="com.dts.job.IssueDtsUpdateJob"></bean>
public class IssueDtsUpdateJob {
public void updateAuto()
{
System.out.println("调度IssueDtsUpdateJob");
}
}
4 Spring集成quartz的优势
代码低侵入性,IssueDtsUpdateJob只是一个POJO,代码上与quartz没有任何引入和调用。