读书人

在Spring中应用JDK Timer进行任务调度

发布时间: 2012-12-16 12:02:32 作者: rapoo

在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只能做到近似的时间安排。

读书人网 >软件架构设计

热点推荐