Spring任务调度实战之Timer

来源:互联网 发布:若风淘宝店服装店网址 编辑:程序博客网 时间:2024/04/28 13:14

本文地址:http://blog.csdn.net/kongxx/article/details/6751151

在spring中提供了一些关于任务调度的集成功能,最简单的就是利用JDK自带的Timer和TimerTask类来实现简单任务调度。看下面的小例子:

一个简单的Task类,没有实现任何接口,其中包含一个run方法用来运行这个task

[java] view plaincopyprint?
  1. package org.garbagecan.springstudy.schedule.timer;  
  2.   
  3. public class MyTask {  
  4.     private String name;  
  5.       
  6.     public void run() {  
  7.         System.out.println("Run task: " + name + ".");  
  8.     }  
  9.   
  10.     public String getName() {  
  11.         return name;  
  12.     }  
  13.   
  14.     public void setName(String name) {  
  15.         this.name = name;  
  16.     }  
  17. }  

创建一个spring的配置文件,比如spring.xml,内容如下

[html] view plaincopyprint?
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"  
  5.        default-lazy-init="true">  
  6.   
  7.     <bean id="timerFactory" class="org.springframework.scheduling.timer.TimerFactoryBean" lazy-init="false">  
  8.         <property name="scheduledTimerTasks">  
  9.             <list>  
  10.                 <ref local="scheduledTask1"/>  
  11.                 <ref local="scheduledTask2"/>  
  12.             </list>  
  13.         </property>  
  14.     </bean>  
  15.   
  16.     <bean id="scheduledTask1" class="org.springframework.scheduling.timer.ScheduledTimerTask">  
  17.         <property name="delay" value="0" />  
  18.         <property name="period" value="10000" />  
  19.         <property name="timerTask">  
  20.             <ref bean="methodInvokingTask1"/>  
  21.         </property>  
  22.     </bean>  
  23.   
  24.     <bean id="scheduledTask2" class="org.springframework.scheduling.timer.ScheduledTimerTask">  
  25.         <property name="delay" value="0" />  
  26.         <property name="period" value="10000" />  
  27.         <property name="timerTask">  
  28.             <ref bean="methodInvokingTask2"/>  
  29.         </property>  
  30.     </bean>  
  31.       
  32.     <bean id="methodInvokingTask1" class="org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean">  
  33.         <property name="targetObject" ref="myTask1"/>  
  34.         <property name="targetMethod" value="run"/>  
  35.     </bean>  
  36.   
  37.     <bean id="methodInvokingTask2" class="org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean">  
  38.         <property name="targetObject" ref="myTask2"/>  
  39.         <property name="targetMethod" value="run"/>  
  40.     </bean>  
  41.   
  42.     <bean id="myTask1" class="org.garbagecan.springstudy.schedule.timer.MyTask">  
  43.         <property name="name" value="task1"/>  
  44.     </bean>  
  45.       
  46.     <bean id="myTask2" class="org.garbagecan.springstudy.schedule.timer.MyTask">  
  47.         <property name="name" value="task2"/>  
  48.     </bean>  
  49. </beans>  
1. 定义了两个task,task1和task2;
2. 利用spring提供的MethodInvokingTimerTaskFactoryBean类来实现来实现对对task类和方法的声明,声明目标对象和方法,从而使spring知道要运行那个类的那个方法;
3. 利用ScheduledTimerTask类来配置每个task的启动时间延时,每次启动之间的间隔,当然还有最重要的是需要运行那个对象,这里使用的上面提到的MethodInvokingTimerTaskFactoryBean类的实例;

4. 最后定义了一个TimerFactoryBean类,并且把ScheduledTimerTask类的实例作为需要调度的task;


最后,写一个测试类来测试上面的代码和配置

[java] view plaincopyprint?
  1. package org.garbagecan.springstudy.schedule.timer;  
  2.   
  3. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  4.   
  5. public class Test {  
  6.     public static void main(String[] args) throws Exception {  
  7.         new ClassPathXmlApplicationContext("/org/garbagecan/springstudy/schedule/timer/spring.xml");  
  8.     }  
  9. }  
运行Test类,可以看到两个task都会启动,并且使用同样的10秒作为每次运行之间的间隔。
0 0