用来记录一些原创性的总结
假设有一个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.CronTriggerFactoryBean
或org.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所写)