quartz与spring进行集成

时间:2021-08-10 04:05:53

上一篇将了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啦。