相信大家在开发中经常遇到“定时任务”的的需求,例如:定时后台生成报表,定时触发后台日志等等。。。。。
在没有接触spring的时候,这样的需求好像是学习多线程的例子。大家的设计思路不外呼:启动程序的时候启动一个任务线程,间隔固定的时间让线程激活一次。
接触spring后,发现这个需求实现的愈发的简单,谢谢xml配置文件就可以了,不用开发人员写线程控制代码,减少了开放工作量。
下面就把我配置的第一个例子当笔记记录下来,方便自己日后查询。
从代码开始把:
package com.test;
public class MyTimer {
public static void main(String[] args) {
// TODO 自动生成方法存根
MyTimer mt=new MyTimer();
mt.myTime();
}
public void myTime(){
for (int i=0;i<10;i++){
System.out.println("我就是要输出!标准方法输出lll");
}
}
}
方法十分的简单,就一个myTime方法,循环输出一句测试代码。剩下的工作就是写配置了。
<bean id="MyTimer" class="com.test.MyTimer"></bean>
<bean id="methodInvokingTask"
class="org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean">
<property name="targetObject">
<ref bean="MyTimer" />
</property>
<property name="targetMethod">
<value>myTime</value>
</property>
</bean>
<bean id="scheduledTadk"
class="org.springframework.scheduling.timer.ScheduledTimerTask">
<property name="delay">
<value>9000</value>
</property>
<property name="period">
<value>9000</value>
</property>
<property name="timerTask">
<ref bean="methodInvokingTask" />
</property>
</bean>
<bean id="timerFactory" class="org.springframework.scheduling.timer.TimerFactoryBean">
<property name="scheduledTimerTasks">
<list>
<ref local="scheduledTadk"/>
</list>
</property>
</bean>
<bean id="MyTimer" class="com.test.MyTimer"></bean>这个没甚么多说的,我们的测试代码bean文件。
<bean id="methodInvokingTask"
class="org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean">
<property name="targetObject">
<ref bean="MyTimer" />
</property>
<property name="targetMethod">
<value>myTime</value>
</property>
</bean>
这个是用来指定需要启动哪个类中的哪个方法为任务的bean. targetObject 指定类,tergetMethod 指定类中的哪个方法是任务方法。
<bean id="scheduledTadk"
class="org.springframework.scheduling.timer.ScheduledTimerTask">
<property name="delay">
<value>9000</value>
</property>
<property name="period">
<value>9000</value>
</property>
<property name="timerTask">
<ref bean="methodInvokingTask" />
</property>
</bean>
这个是指定任务的触发时间,delay 指定容器初始运行时间,也就是第一次允许的时间,一般从容器启动后开始。 Period指定任务的间隔时间。忘记说了,参数是毫秒单位,60000表示一分钟。 timerTask 指定的是任务方法所在的bean。(特别说明:老版本中,Timer启动任务需要你的任务类继承TimerTask类,这里不介绍了,spring 2.0 以后的版本帮我们简化了工作,只需要指定方法就可以了。)
<bean id="timerFactory" class="org.springframework.scheduling.timer.TimerFactoryBean">
<property name="scheduledTimerTasks">
<list>
<ref local="scheduledTadk"/>
</list>
</property>
</bean>
这个是启动bean,看名字也知道是工厂。一个管理任务的工厂,你的程序中,也许不只一个任务,都可以配置到list 节点下面。总体来说,还是很简单滴。。。。。
这样,我们的配置完成了,可以运行下看看效果了,启动tomcat 。。。。。。。 几秒后,我们期望的测试输出显示。。。。。。。。。
(spring 中还可以配置 quartz,这个下面介绍把,今天就学习到这里。)