应用场景:每月10号,我们都会收到本月薪资的邮件;托管行会在每天早上发送可用头寸表。这些事情都不是用户动作引起的,而是系统根据任务调度规划引发的一些动作。
1 使用Java Timer调度任务
从jdk1.3开始,java.util.Timer类提供了基本的调度功能。这个类允许你调用一个任务(java.util.TimerTask子类定义)按任意周期运行。
Spring通过TimerFactoryBean向应用程序上下文提供对java Timer的支持。TimerFactoryBean是Spring的一个工厂类,用于在应用程序上下文(运行TimerTask的)中生成Java Timer。下面展示了TimerFactoryBean是如何工作的。
创建一个定时任务
public class ScanFileTask extends TimerTask { public void run() { System.out.println("开始扫描文件了"); } }
run()方法定义了当任务运行时该做什么。
在spring的配置文件中配置该bean。
<bean id="scanFileTask" class="org.utmost.jms.ScanFileTask"/>
spring的 ScheduledTimerTask定义了定时器任务运行周期period。delay属性指定当任务第一次运行之前等待多长时间。timerTask告诉ScheduledTimerTask执行那个TimerTask。
<bean id="testTask" class="org.springframework.scheduling.timer.ScheduledTimerTask"> <property name="timerTask" ref="scanFileTask"></property> <property name="period" value="40000"/> <property name="delay" value="10000"/> </bean>
最后一步就是启动定时器了。
<bean class="org.springframework.scheduling.timer.TimerFactoryBean"> <property name="scheduledTimerTasks"> <list> <ref bean="testTask"/> </list> </property> </bean>
scheduledTimerTasks是一个需要启动定时器的列表。
遗憾的是,java Timer的一个局限性,你可以指定执行任务的频度,但你无法精确指定它何时运行。Quartz能够指定时间运行。