`
ispring
  • 浏览: 359407 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

在Spring中使用 Java Timer 调度任务

阅读更多
从Java 1.3开始,Java SDK就通过java.util.Timer类提供了基本的调度功能。这个类允许你调度一个任务(通过java.util.TimerTask子类定义)按任意周期运行。

创建一个定时器任务
使用Java Timer来调度发送注册报表邮件的第一步是从java.util.TimerTask中派生出邮件任务,如以下程序所示。

 程序:一个用于发送注册报表邮件的定时器任务
public class EmailReportTask extends TimerTask {
    public EmailReportTask() {}
    public void run() {
        courseService.sendCourseEnrollmentReport();
    }
    private CourseService courseService;
    public void setCourseService(CourseService courseService) {
        this.courseService = courseService; 
    }
}

run()方法定义了当任务运行时该做什么。在上面的例子中,它调用CourseService的sendCourseEnrollmentReport()方法(见程序清单7.1)来发送注册报表邮件。CourseService是通过依赖注入方式提供给EmailReportTask的。
按以下方式在Spring配置文件中声明EmailReportTask:
<bean id="reportTimerTask" class="com.springinaction.training.schedule.EmailReportTask">
    <property name="courseService">
        <ref bean="courseService"/>
    </property>

</bean>



这个声明本身只是将EmailReportTask放到应用上下文中,并在courseService属性中装配courseService Bean。在你调度它之前,它不会做任何有用的事。

调度定时器任务
Spring的ScheduledTimerTask定义了一个定时器任务的运行周期。既然课程主任要求每天向她发送注册报表,你应该以如下方式装配一个ScheduledTimerTask:
<bean id="scheduledReportTask" class="org.springframework.scheduling.timer.ScheduledTimerTask">
    <property name="timerTask">
        <ref bean="reportTimerTask"/>
    </property>
    <property name="period">
        <value>86400000</value>
    </property>
</bean>

属性timerTask告诉ScheduledTimerTask运行哪个TimerTask。在这里,该属性装配了指向reportTimerTask的一个引用,它就是EmailReportTask。属性period告诉ScheduledTimerTask以怎样的频度调用TimerTask的run()方法。这个属性以毫秒作为单位,它被设置为86400000,指定这个任务应该每24小时运行一次。

启动定时器
最后一步是启动定时器。Spring的TimerFactoryBean负责启动定时任务。按以下方式在Spring配置文件中声明它:
<bean class="org.springframework.scheduling.timer.TimerFactoryBean">
     <property name="scheduledTimerTasks">
        <list>
            <ref bean="scheduledReportTask"/>
        </list>
    </property>
</bean>

属性scheduledTimerTasks要求一个需要启动的定时器任务的列表。既然你现在只有一个定时器任务,这个列表中只包含一个指向scheduledReportTask Bean的引用。

遗憾的是,即使这个任务已经能够每隔24小时运行一次了,在这里你无法指定它应该在一天中的哪个时间点执行。ScheduledTimerTask有一个delay属性,允许你指定当任务第一次运行之前应该等待多久。例如,要将EmailReportTask的第一次运行延迟1小时,可以按照以下方式进行配置:
<bean class="org.springframework.scheduling.timer.TimerFactoryBean">
     <property name="scheduledTimerTasks">
        <list>
            <ref bean="scheduledReportTask"/>
        </list>
    </property>

    <!-- delay 属性指定其间隔时间 -->
    <property name="delay">
        <value>3600000</value>
    </property>
</bean>

即使使用deplay属性,EmailReportTask的第一次运行时间仍然是相对于应用程序的启动时间的。怎样才能做到如课程主任所要求的在每天早晨6:00发送邮件(而不是在早晨5:00启动应用程序)呢?

遗憾的是,这是Java Timer的一个局限性。你可以指定任务执行的频度,但你无法精确指定它何时运行。为了能够精确指定何时发送电子邮件,你需要使用Quartz调度器。
分享到:
评论
2 楼 呆呆DE萌萌 2014-11-24  
不可以吗?
Timer里不是有一个指定首次运行时间firstDate的schedule函数吗?

另外也可以通过时间计算出当前时间和需要首次运行时间之间的差距来达到这个目的啊
1 楼 gyhgc 2008-07-31  
<!-- delay 属性指定其间隔时间 -->  
    <property name="delay">  
        <value>3600000</value>  
    </property>  
位置放置不正确,应该放在
<property name="period">  
        <value>86400000</value>  
    </property>  
后面。
即使用ScheduledTimerTask来包装。

相关推荐

    小码农的代码(四)----------JAVA中Timer定时器与Spring定时任务

    在Java编程语言中,`Timer`类和Spring框架的定时任务是两种常见的实现定时执行任务的方式。本篇文章将深入探讨这两个主题,旨在帮助初学者理解它们的工作原理以及如何在实际项目中应用。 首先,让我们来看一下Java...

    spring timer、quartz俩种任务调度

    下面我们将深入探讨这两种任务调度器及其在Spring中的使用。 首先,我们来看`Spring Timer`。`Spring Timer`是Spring框架提供的一个简单任务调度工具,它基于Java的`java.util.Timer`类。通过`@Scheduled`注解,...

    在Spring中使用Timer --实现由时间触发的事件任务.doc

    在Spring中使用`Timer`,有两种主要的方法来创建和调度这些时间触发的事件任务: 1. **继承TimerTask创建任务** 这种方法与传统的Java `Timer`用法相似。你需要创建一个类,继承自`java.util.TimerTask`,并重写`...

    Java关于时间调度的几种实现方(Timer Quartz Spring)

    本篇文章将深入探讨Java中的三种主要时间调度实现:`Timer`、`TimerTask`、以及第三方库`Quartz`和`Spring`的定时任务功能。 ### 1. Java `Timer` 和 `TimerTask` `java.util.Timer` 类提供了一个调度任务的方法,...

    Quartz--JAVA定时任务\Java应用:Java调度任务和Spring Quartz (1)

    在JDK 1.3及以后的版本中,`java.util.Timer`类提供了基础的定时任务支持。不过,`Timer`类的功能相对有限,无法精确地在特定时间点执行任务,比如设置每天特定时间执行的任务。 Quartz是一个强大且灵活的开源作业...

    JAVA定时任务调度

    在Java中,我们可以使用多种方式来实现定时任务,如Java内置的`java.util.Timer`类、`java.util.concurrent.ScheduledExecutorService`,以及更强大的第三方库如Quartz Scheduler和Spring框架中的`@Scheduled`注解等...

    java是使用timer调度的例子

    在Java编程语言中,`Timer`类是Java.util包的一部分,用于执行定时任务。这个类提供了计划在将来某个特定时间运行的任务的能力。`Timer`类是线程安全的,但它的`TimerTask`子类不是,所以在多线程环境下需要注意同步...

    Spring使用timer定时器-能精确几点运行定时任务

    本教程将详细介绍如何在Spring中使用`Timer`来实现能精确到几点运行的定时任务。 首先,我们需要理解`Timer`的基本概念。`java.util.Timer`和`java.util.TimerTask`是Java中的两个类,用于调度未来任务的执行。`...

    java定时任务调度

    在Java中,有多种实现定时任务调度的方式,包括但不限于Java内置的`java.util.Timer`类、Spring框架的`@Scheduled`注解以及Quartz库。 1. **Java内置的`java.util.Timer`和`TimerTask`**: - `Timer`类用于创建一...

    Spring的quartz和Timer实现定时

    在Java世界中,任务调度是十分重要的,Spring框架提供了多种定时任务实现方式,其中包括Quartz和Timer。Quartz是一款开源的作业调度框架,而Timer是Java标准库中的一个类,用于执行定时任务。这两个工具都能帮助...

    spring任务调度实例

    而在Spring框架中,任务调度是一个重要的特性,用于自动执行预定的任务。本实例主要探讨了Spring如何实现任务调度,特别是使用Quartz和Timer两种不同的方法。 首先,Quartz是一个开源的作业调度框架,它允许开发者...

    java_Timer定时器实例_Spring实例

    标题与描述均提到了“Java_Timer定时器实例_Spring实例”,这表明文章主要讨论的是如何在Java中使用Timer类创建定时任务,并将其整合到Spring框架中。以下是对该主题的详细解析: ### Java中的Timer定时器 #### ...

    Spring的定时任务开发及对Quartz和Timer支持

    通过实现这些接口或使用其默认实现,如ThreadPoolTaskExecutor和ConcurrentTaskScheduler,我们可以轻松地在Spring应用中集成任务调度。 接下来,Spring还支持集成第三方定时任务库,如Quartz和Timer。Quartz是一个...

    Sring最佳实践-集成任务调度服务

    要在Spring中使用Timer,你需要创建一个TimerTask实现类,然后在Spring配置文件中声明并配置该任务。例如: ```xml &lt;bean id="timer" class="org.springframework.scheduling.timer.TimerFactoryBean"&gt; ...

    Spring 使用Timer quartz区别

    在实际使用中,如果你的应用只需要简单的定时任务,如定期清理缓存,那么`java.util.Timer` 就足够了,它简洁易用,且不需要额外的依赖。但如果你需要处理复杂的定时需求,如根据业务规则动态调整任务执行时间,或者...

    java Timer定时器实例 Spring实例.doc

    在Java中,`java.util.Timer` 类是用于调度任务的类,它可以在特定的时间点或者按照设定的周期执行某项任务。`Timer` 类提供了两种计划任务的方法:`schedule(TimerTask task, long delay)` 和 `scheduleAtFixedRate...

    运用Spring框架实现简单调度

    JAVA开发语言中,调度程序实现的办法有很多,从最底层的线程到Timer,都是最基本的调度实现。当前很多开源项目也提供了比较全面的调度功能,如quartz、jcrontab、JobServer等,在这里我介绍一种比较简单的调度,没有...

    关于 spring 里的定时任务设置

    在上述示例中,我们看到了如何使用Spring结合Java Timer API来创建定时任务。首先,自定义了一个`SayHelloTask`类,继承自`TimerTask`,并在`run()`方法中定义了具体要执行的任务。例如,输出一句"测试 TimerTask : ...

    JBPM3.2与Spring结合时任务调度的实现.doc

    JBPM3.2与Spring的整合主要是为了实现任务调度的功能,这在企业级应用中是非常重要的,因为它能够自动化执行定时任务,如流程启动、数据同步、报告生成等。在JBPM3.1.x版本中,通过SpringModules提供的`spring-...

    Spring的 Scheduled任务调度.docx

    Spring 提供了多种定时任务的实现方式,包括 Java 自带的 Timer、Quartz 和 Spring 自己的 Scheduled 任务调度。在 Spring Boot 中,Scheduled 任务调度变得更加简单易用。 `@Scheduled` 是 Spring 提供的一个注解...

Global site tag (gtag.js) - Google Analytics