科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件在Spring中使用JDK Timer进行任务调度

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

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

作者:闹市孤僧 2007年5月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){cancel();}② 在任务运行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"class="com.baobaotao.basic.timer.SimpleTimerTask" />

<bean id="scheduledTask"class="org.springframework.scheduling.timer.ScheduledTimerTask">

<property name="timerTask" 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" class="com.baobaotao.service.MyService" />

<bean id="timerTask1"① 将返回一个TimerTask实例

class="org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean">

<property name="targetObject" 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"class="org.springframework.scheduling.timer.TimerFactoryBean">

<property name="scheduledTimerTasks">

<list>

<ref bean="scheduledTask" />

</list>

</property>

</bean>

scheduledTimerTasks属性的类型为ScheduledTimerTask[],可以注入多个ScheduledTimerTask。此外TimerFactoryBean还拥有一个daemon属性,指定生成Timer的背景线程是否为后台线程。

小结

JDK Timer可以满足一些简单的任务调度需求,好处就是你不必引用JDK之外的第三方类库,学习也很简单。

但你必须保证你的任务是短小型的任务,任务应该很快就能执行完成,否则将产生“时间漂移”的问题。此外,使用JDK Timer的任务对执行时间点应该没有严格的要求,因为JDK Timer只能做到近似的时间安排。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章