`
ispring
  • 浏览: 355618 次
  • 性别: 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来包装。

相关推荐

    spring timer、quartz俩种任务调度

    实现了spring配置比较流行的任务调度操作,java timer 和 quartz俩种方式 并且有注释描述。

    java是使用timer调度的例子

    java中用timer调度,像spring提供的Quartz一样,这里是自己调用java API中的timer写的,忘下载者给与评价

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

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

    运用Spring框架实现简单调度

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

    Spring Boot中的@Scheduled注解:定时任务的原理与实现

    这个注解主要基于Java的内置Timer类以及Quartz等定时任务库,但在Spring Boot中,它提供了更加简洁和易用的方式来实现定时任务。 # 实现原理 @Scheduled注解的实现原理主要依赖于Spring框架的任务调度机制。当...

    SPRING 定时器的使用

    并非应用系统中发生的所有事情都是由用户的动作引起的。...在Spring中有两种流行配置:Java的Timer类和OpenSymphony的Quartz来执行调度任务。下面以给商丘做的接口集抄900到中间库的日冻结数据传输为例:

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

    Sring最佳实践-集成任务调度服务,之前做的Demo,希望对大家有所帮助!!!

    Spring-Reference_zh_CN(Spring中文参考手册)

    6.8.1. 在Spring中使用AspectJ来为domain object进行依赖注入 6.8.1.1. @Configurable object的单元测试 6.8.1.2. 多application context情况下的处理 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来...

    Spring排程(Scheduling)技术

    Spring排程(Scheduling)技术 1、排程(Scheduling)原理 2、什么是Timer 1)、执行一次 2)、周期执行 3、在spring中使用Timer 4、在spring中使用Quartz调度器

    Spring中文帮助文档

    6.8.1. 在Spring中使用AspectJ进行domain object的依赖注入 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来配置AspectJ的切面 6.8.4. 在Spring应用中使用AspectJ加载时织入(LTW) 6.9. 更多资源 7...

    spring in action英文版

     7.3.1 使用Java Timer调度任务  7.3.2 使用Quartz调度器  7.3.3 按调度计划调用方法  7.4 使用JMS发送消息  7.4.1 使用JMS模板发送消息  7.4.2 消费消息  7.4.3 转换消息  7.5 小结 第三...

    Spring in Action(第二版 中文高清版).part2

    12.3.1 使用Java Timer调度任务 12.3.2 使用Quartz调度器 12.3.3 按调度计划调用方法 12.4 使用JMX管理Spring Bean 12.4.1 将Spring Bean输出为MBean 12.4.2 远程访问MBean 12.4.3 处理通知 12.5 小结 第...

    Spring in Action(第二版 中文高清版).part1

    12.3.1 使用Java Timer调度任务 12.3.2 使用Quartz调度器 12.3.3 按调度计划调用方法 12.4 使用JMX管理Spring Bean 12.4.1 将Spring Bean输出为MBean 12.4.2 远程访问MBean 12.4.3 处理通知 12.5 小结 第...

    任务调度开源框架Quartz动态添加、修改和删除定时任务

    Quartz 是个开源的作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制。Quartz框架包含了调度器监听、作业和触发器监听。你可以配置作业和触发器监听为全局监听或者是特定于作业和触发器的监听...

    Spring.3.x企业应用开发实战(完整版).part2

    12.2 在Spring中使用Hibernate 12.2.1 配置SessionFactory 12.2.2 使用HibernateTemplate 12.2.3 处理LOB类型数据 12.2.4 添加Hibernate事件监听器 12.2.5 使用原生Hibernate API 12.2.6 使用注解配置 12.2.7 事务...

    Spring 2.0 开发参考手册

    6.8.1. 在Spring中使用AspectJ来为domain object进行依赖注入 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来配置AspectJ的切面 6.8.4. 在Spring应用中使用AspectJ Load-time weaving(LTW) 6.9. ...

    spring4.1核心包

    这个jar文件包含支持缓存Cache(ehcache)、JCA、JMX、邮件服务(Java Mail、COS Mail)、任务计划Scheduling(Timer、Quartz)方面的类。 UI方面的用来与模板(Templating)引擎如 Velocity、FreeMarker、...

    Spring in Action(第2版)中文版

    12.3.1使用javatimer调度任务 12.3.2使用quartz调度器 12.3.3按调度计划调用方法 12.4使用jmx管理springbean 12.4.1将springbean输出为mbean 12.4.2远程访问mbean 12.4.3处理通知 12.5小结 第三部分spring...

    Spring3.x企业应用开发实战(完整版) part1

    12.2 在Spring中使用Hibernate 12.2.1 配置SessionFactory 12.2.2 使用HibernateTemplate 12.2.3 处理LOB类型数据 12.2.4 添加Hibernate事件监听器 12.2.5 使用原生Hibernate API 12.2.6 使用注解配置 12.2.7 事务...

    Spring API

    6.8.1. 在Spring中使用AspectJ进行domain object的依赖注入 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来配置AspectJ的切面 6.8.4. 在Spring应用中使用AspectJ加载时织入(LTW) 6.9. 更多资源 7...

Global site tag (gtag.js) - Google Analytics