Spring对java.util.Timer提供的任务调度支持

自从Java 2 SDK 1.3开始,借助于java.util.Timer类能够为企业应用提供任务调度支持。尽管现有的Timer没有Quartz功能丰富,但它能够满足简单的企业应用需求。而且,开发者也不用另外学习Quartz这样一套全新的类库,因为Java
2本身就内置了对Timer的支持。因此,Spring还是针对java.util.Timer提供了org.springframework.scheduling.timer包,以支持基于Timer的任务调度。
为了完成用户任务的开发,开发者提供的任务类必须继承于java.util.TimerTask类。下面摘录了imagedb中提供的ListImagesTimerTask类。用户任务被实现在run()中,此后Timer会依据开发者指定的调度规则重复调用到run()。
public class ListImagesTimerTask extends TimerTask {
......
public void run() {
      logger.info("Listing images in image database, scheduled by Timer");
      List images = this.imageDatabase.getImages();
      ......
}
}
在完成TimerTask的开发后,我们可以在WEB-INF/schedulingContext-timer.xml中配置它,相关配置摘录如下。ScheduledTimerTask用于制定调度规则,delay属性表示成功调度timerTask任务后第1次执行这一任务需等待的时间(单位:毫秒),period属性表示任务执行的间隔(单位:毫秒)。
<bean id="listImagesTimerTask"
class="org.springframework.samples.imagedb.scheduling.ListImagesTimerTask">
<property name="imageDatabase" ref="imageDatabase"/>
<property name="mailSender" ref="mailSender"/>
<property name="mailFrom" value="${mail.from}"/>
<property name="mailTo" value="${mail.to}"/>
</bean>
<bean id="listImagesScheduledTask" class="org.springframework.scheduling.timer.
ScheduledTimerTask">
<property name="timerTask" ref="listImagesTimerTask"/>
<property name="delay" value="10000"/>
<property name="period" value="10000"/>
</bean>
另一方面,开发者也可以将普通的POJO类指定为待调度的任务。Spring提供的timer包存在MethodInvokingTimerTaskFactoryBean辅助类,下面展示了它的使用。此时,targetObject属性用于指定目标受管POJO,而targetMethod属性用于指定这一受管POJO中的某个方法。用户任务被实现在checkImages()中,此后Timer会依据开发者指定的调度规则重复调用到checkImages()。MethodInvokingTimerTaskFactoryBean还暴露了targetClass、staticMethod属性,它们用于调用类中的静态方法。
<bean id="checkImagesTimerTask"
class="org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean">
<property name="targetObject" ref="imageDatabase"/>
<property name="targetMethod" value="checkImages"/>
</bean>
<bean id="checkImagesScheduledTask" class="org.springframework.scheduling.timer.
ScheduledTimerTask">
<property name="timerTask" ref="checkImagesTimerTask"/>
<property name="delay" value="5000"/>
<property name="period" value="5000"/>
</bean>
在制订上述2条调度规则后,开发者要实施它们,而TimerFactoryBean能够担当此任,示例配置如下。借助scheduledTimerTasks属性,开发者能够指定由若干ScheduledTimerTask构成的集合。
<bean id="timer" class="org.springframework.scheduling.timer.TimerFactoryBean">
<property name="scheduledTimerTasks">
      <list>
          <ref local="listImagesScheduledTask"/>
          <ref local="checkImagesScheduledTask"/>
      </list>
</property>
<property name="daemon" value="true"/>
</bean>
同Quartz相比,Timer支持的调度规则非常有限,而且它甚至没有提供内置的线程池。比如,Timer不能够指定类似于“某年某月某日要执行某任务”的调度规则。

你可能感兴趣的:(java,spring,bean,quartz,企业应用)