在Spring中使用JDK Timer进行任务调度
在Spring中使用JDK Timer进行任务调度
?
ZDNet软件频道 时间:2007-05-29 作者:闹市孤僧 | 我要评论()
本文关键词:
JDK Timer实例
首先创建一个任务,并在运行10次以后退出运行,代码如下:
?
package com.baobaotao.basic.timer;
?
import java.util.Date;
?
import java.util.TimerTask;
?
public class SimpleTimerTaskextends TimerTask{
?
private int count = 0;
?
public void run() {
?
System.out.println("execute task.");
?
Date exeTime = (new Date(scheduledExecutionTime()));①获取本次安排执行的时间点
?
System.out.println("本次任务安排执行时间点为:"+exeTime);
?
if(++count > 10)② 在任务运行10次后主动退出运行
?
}
?
}
?
通过扩展TimerTask并实现run()抽象方法定义一个任务。在JDK Timer中没有指定运行特定次数任务的方法。你可以在任务的run()方法中通过自定义代码实现。
?
下面通过Timer以固定延迟时间的方式每5秒执行一次任务:
?
package com.baobaotao.basic.timer;
?
import java.util.Timer;
?
import java.util.TimerTask;
?
public class TimerRunner {
?
public static void main(String[] args) {
?
Timer timer = new Timer();
?
TimerTask task = new SimpleTimerTask();
?
timer.schedule(task,1000L,5000L); ①在延迟1秒钟后,每5秒钟运行一次任务
?
}
?
}
?
运行以上代码,将输出以下信息:
?
execute task.
?
本次任务安排执行时间点为:Thu Mar 15 18:39:37 CST 2007
?
execute task.
?
本次任务安排执行时间点为:Thu Mar 15 18:39:42 CST 2007
?
execute task.
?
本次任务安排执行时间点为:Thu Mar 15 18:39:47 CST 2007
?
Spring对JDK Timer的支持
Spring在org.springframework.scheduling.timer中提供了几个JDK Timer的支持类,主要在以下三方面对JDK Timer提供了支持:
?
1) ScheduledTimerTask,它对TimerTask提供封装并或配置调度信息;
?
2)通过MethodInvokingTimerTaskFactoryBean类可以将一个Bean的方法封装为TimerTask;
?
3)通过TimerFactoryBean可以更方便地配置Timer,此外让Timer的生命周期和Spring容器的生命周期相关,在初始化TimerFactoryBean后,启动Timer,在Spring容器关闭前取消Timer。
?
使用ScheduledTimerTask
JDK Timer标准的API要求我们使用Timer方法进行任务调度时才指定调度的规则,这种方式不太适合进行Bean的配置,因此Spring提供了ScheduledTimerTask,通过属性指定任务和调度规则,请看下面的代码:
?
<bean id="timerTask"/>
?
<bean id="scheduledTask"ref="timerTask" />①指定调度任务
?
<property name="delay" value="1000" />②延迟时间,单位为毫秒
?
<property name="period" value="1000" />③周期时间,单位为毫秒
?
</bean>
?
如果只希望运行一次任务,将period设置为0或负值。默认情况下,采用固定时间间隔的调度方式,可以通过fixedRate属性,以固定频率的方式运行任务。SimpleTimerTask还可以将实现了Runnable接口的类封装成一个任务,你可以通过runnable属性进行设置。
?
MethodInvokingTimerTaskFactoryBean
类似于Quartz的MethodInvokingJobDetailFactoryBean,Spring也为JDK Timer提供了一个方便类用以将Bean方法封装成一个TimerTask:
?
<bean id="myService" />
?
<bean id="timerTask1"① 将返回一个TimerTask实例
?
ref="myService" />② 业务Bean
?
<property name="targetMethod" value="doJob" />③ 业务方法
?
</bean>
?
TimerFactoryBean
类似于Quartz的SchedulerFactoryBean,Spring为Timer提供了TimerFactoryBean类。你可以将多个ScheduledTimerTask注册到TimerFactoryBean中,TimerFactoryBean将返回一个Timer实例。在TimerFactoryBean初始化完成后,对应的Timer启动,在Spring 容器关闭之前,TimerFactoryBean将取消Timer。请看下面的配置代码:
?
<bean id="timer"/>
?
</list>
?
</property>
?
</bean>
?
scheduledTimerTasks属性的类型为ScheduledTimerTask[],可以注入多个ScheduledTimerTask。此外TimerFactoryBean还拥有一个daemon属性,指定生成Timer的背景线程是否为后台线程。
?
小结
JDK Timer可以满足一些简单的任务调度需求,好处就是你不必引用JDK之外的第三方类库,学习也很简单。
?
但你必须保证你的任务是短小型的任务,任务应该很快就能执行完成,否则将产生“时间漂移”的问题。此外,使用JDK Timer的任务对执行时间点应该没有严格的要求,因为JDK Timer只能做到近似的时间安排。