在Spring中使用 Java Timer 调度任务
从Java 1.3开始,Java SDK就通过java.util.Timer类提供了基本的调度功能。这个类允许你调度一个任务(通过java.util.TimerTask子类定义)按任意周期运行。
创建一个定时器任务
使用Java Timer来调度发送注册报表邮件的第一步是从java.util.TimerTask中派生出邮件任务,如以下程序所示。
程序:一个用于发送注册报表邮件的定时器任务
Java代码
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:
Java代码
<bean id="reportTimerTask" name="code"><bean id="scheduledReportTask" name="code"><bean name="code"><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调度器:http://xingxingyu.iteye.com/blog/618292