欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring(29)——Spring整合Quartz

程序员文章站 2022-04-17 20:45:12
...

假设有一个QuartzTasks类,其有一个print方法,现需要在Spring中使用Quartz对其进行定时调度。我们先配置一个JobDetail,采用Spring提供的MethodInvokingJobDetailFactoryBean,其可以指定需要调度的对象及其方法名称。配置如下:

<bean id="quartzTasks" class="com.elim.learn.spring.task.QuartzTasks"/>

<bean 
    id="quartzTasksJobDetail" 
    class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean" 
    p:targetObject-ref="quartzTasks"
    p:targetMethod="print"/>

定义JobDetail时如果不希望该Job可以并发调度,即前一次还没有调度完成时不希望下一次调度开始,则可以指定concurrent属性为false。默认是可以并发调度的。

<bean 
    id="quartzTasksJobDetail" 
    class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean" 
    p:targetObject-ref="quartzTasks"
    p:targetMethod="print" 
    P:concurrent="false"/>

然后是定义Trigger,可以选择使用Spring提供的org.springframework.scheduling.quartz.CronTriggerFactoryBeanorg.springframework.scheduling.quartz.SimpleTriggerFactoryBean。CronTriggerFactoryBean用来根据cron表达式定义调度时机。下面的配置就配置了每分钟触发一次quartzTasksJobDetail的调度。

<bean 
    id="cronTrigger" 
    class="org.springframework.scheduling.quartz.CronTriggerFactoryBean" 
    p:jobDetail-ref="quartzTasksJobDetail" 
    p:cronExpression="0 * * * * ?"/>

SimpleTriggerFactoryBean用来定义每隔多长时间调度一次,可以指定初始延迟时间,总的调度次数。下面的配置就定义了每隔3秒调度一次quartzTasksJobDetail,初次调度延迟2秒进行,然后总共重复5次,即一共会进行6次调度。

<bean 
    id="simpleTrigger" 
    class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean" 
    p:jobDetail-ref="quartzTasksJobDetail" 
    p:startDelay="2000" 
    p:repeatInterval="3000" 
    p:repeatCount="5"/>

有了Trigger之后需要通过Scheduler进行注册,下面的代码就定义了一个Scheduler,同时注册了上面定义的两个Trigger。这样当Spring容器启动以后注册的Trigger在达到了调度时机时就会自动进行调度了。

<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="triggers">
        <list>
            <ref bean="cronTrigger" />
            <ref bean="simpleTrigger"/>
        </list>
    </property>
</bean>

通过SchedulerFactoryBean也可以指定一些其它信息,比如下面的代码就指定了Job调度时使用的TaskExecutor。更多信息的指定可以参考对应的API文档。

<bean 
    class="org.springframework.scheduling.quartz.SchedulerFactoryBean" 
    p:taskExecutor-ref="myExecutor">
    <property name="triggers">
        <list>
            <ref bean="cronTrigger" />
            <ref bean="simpleTrigger"/>
        </list>
    </property>
</bean>

(注:本文是基于Spring4.1.0所写)