Elim的博客

用来记录一些原创性的总结


Elim

假设有一个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所写)