另外一个调度任务的途径是使用JDK Timer对象。更多的关于Timer
的信息可以在这里http://java.sun.com/docs/books/tutorial/essential/threads/timer.html找到。
上面讨论的概念仍可以应用于Timer的支持。你可以创建定制的timer或者调用某些方法的timer。包装timers的工作由TimerFactoryBean
完成。
你可以使用TimerTask
创建定制的timer tasks,类似于Quartz中的jobs:
public class CheckEmailAddresses extends TimerTask {
private List emailAddresses;
public void setEmailAddresses(List emailAddresses) {
this.emailAddresses = emailAddresses;
}
public void run() {
// iterate over all email addresses and archive them
}
}
包装它很简单:
<bean id="checkEmail" class="examples.CheckEmailAddress"> <property name="emailAddresses"> <list> <value>test@springframework.org</value> <value>foo@bar.com</value> <value>john@doe.net</value> </list> </property> </bean> <bean id="scheduledTask" class="org.springframework.scheduling.timer.ScheduledTimerTask"> <!-- wait 10 seconds before starting repeated execution --> <property name="delay" value="10000" /> <!-- run every 50 seconds --> <property name="period" value="50000" /> <property name="timerTask" ref="checkEmail" /> </bean>
注意若要让任务只运行一次,你可以把period
属性设置为0(或者负值)。
和对Quartz的支持类似,对Timer
的支持也包含一个组件,可以让你周期性的调用某个方法:
<bean id="doIt" class="org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean"> <property name="targetObject" ref="exampleBusinessObject" /> <property name="targetMethod" value="doIt" /> </bean>
以上的例子会调用exampleBusinessObject
对象的doIt
方法。(见下):
public class BusinessObject { // properties and collaborators public void doIt() { // do the actual work } }
将上例中ScheduledTimerTask
的timerTask
引用修改为doIt
,bean将会用一个固定的周期来调用doIt
方法。
TimerFactoryBean
类和Quartz的SchedulerFactoryBean
类有些类似,它们是为同样的目的而设计的:设置确切的任务计划。TimerFactoryBean
对一个Timer进行配置,设置其引用的任务的周期。你可以指定是否使用背景线程。
<bean id="timerFactory" class="org.springframework.scheduling.timer.TimerFactoryBean">
<property name="scheduledTimerTasks">
<list>
<!-- see the example above -->
<ref bean="scheduledTask" />
</list>
</property>
</bean>