quartz与spring进行集成
上一篇将了quartz框架的使用,spring同样也提供了对quartz的集成。这次就尝试一下在spring中集成quartz。
要在spring中使用job,Trigger和Scheduler,就要在spring中配置这3个bean。
同样用上一篇的例子:对于job的配置,十分简单,在applicationContext.xml中加入这一一句
<!-- quartz要调用的工作类 --> <bean id="quartzJob" class="cn.edu.gdut.quartz.HelloQuartz"></bean>
这样,一个job就配置到了spring里面了。
对于JobDetail部分:
这里spring提供了更加灵活的方式,对于一个实现的org.quartz.Job接口的job来说以HelloQuartz来说,spring提供了JobDetailBean来实现调用,配置方式如下
<bean name="jobDatail" class= "org.springframework.scheduling.quartz.JobDetailBean"> <property name="jobClass" value=" quartzJob " /> </bean>
这样,一个JobDetail就配置好了。
另外,spring还提供了一种吧没有实现org.quartz.Job接口的类配置的成为一个作业的方法。
package cn.edu.gdut.quartz; public class DataService { /** * 定期推送服务 */ public void push(){ //TODO 推送逻辑 } }
比如对于以上的一个类,配置成一个bean
<!-- quartz要调用的工作类 --> <bean id="dataJob" class="cn.edu.gdut.quartz.DataService"></bean>
配置该bean的方式有些不同,因为没有实现org.quartz.Job类,我们要指定当触发事件到来时要调用这个实例的哪个方法
在spring中配置如下:
<bean id="dataJobDatail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <!-- 调用的类 --> <property name="targetObject"> <ref bean="dataJob"/> </property> <!-- 调用类中的方法 --> <property name="targetMethod"> <value>push</value> </property> </bean>
这样,同样也可以实现作业调用,其实从spring的命名也可以看出来这是指定调用方法的一个JobDetail。
然后是配置触发器
<bean id="cTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail"> <ref bean="jobDatail"/> </property> <!-- cron表达式 --> <property name="cronExpression"> <value>*/10 * * * * ?</value> </property> </bean>
<bean id="dataTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail"> <ref bean="datJobDatail"/> </property> <!-- cron表达式 --> <property name="cronExpression"> <value>*/20 * * * * ?</value> </property> </bean>
然后是调度器部分
<bean id="easyScheduler" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="cTrigger"/> <ref bean ="dataTrigger"> </list> </property> </bean>
调度器部分,如果设置了lazy-init为false后,则启动IoC容器的时候不需要人为干预就能启动调度任务了。
设置为true后要手动获取这个调度器的bean才会启动调度任务。
ApplicationContext context = new ClassPathXmlApplicationContext( "application.xml"); context.getBean(easyScheduler);
这样,任务就启动了,剩下的工作也交个quartz啦。