浏览 2633 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2012-01-11
最后修改:2012-02-29
引用 网上这么说的: 1、 Spring中使用TimerTask定制任务 (1)、TimerTask实现了Runnable接口,待执行的任务置于run()中。Timer是一个安排TimerTask的类 此两者一般一起工作。应用时首先创建一个TimerTask的对象,然后用一个Timer的类的schedule方法安排执行它。 (2)、Spring提供了ScheduledTimerTask,就是通常所说的任务,把配置好的任务(ScheduledTimerTask)注册到调度器TimerFactoryBean中就可以了。实际上ScheduledTimerTask是对JDK中的TimerTask进行了封装,TimerFactoryBean是对JDK中的Timer进行了封装。 (3)开发使用中Spring配置文件的说明 1、编写NewTimeTask.java,此类需extends TimerTask类,在run方法中编写要执行的操作 2、Spring配置文件 <beans> <!-- 自己编写的任务类 --> <bean id="newTask" class="com.huawei.esop.task.NewTimeTask"></bean> <bean id="newsScheduledTask" class="org.springframework.scheduling.timer.ScheduledTimerTask"> <!-- 系统启动后60秒开始执行 单位毫秒--> <property name="delay" value="60000"></property> <!-- 每60秒执行一次 --> <property name="period" value="60000"></property> <!-- 执行的任务 --> <property name="timerTask" ref="newTask"></property> </bean> <!-- 注册调度器 --> <bean id="timerFactory" class="org.springframework.scheduling.timer.TimerFactoryBean"> <property name="scheduledTimerTasks"> <list> <ref bean="newsScheduledTask" /> </list> </property> </bean> </beans> 上面这段说法 这就类似我下面的这个创建方式 一 创建timerManager 管理类。 import java.util.Timer; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import org.apache.commons.lang.time.DateUtils; public class timerManager implements ServletContextListener { //每天的毫秒数 public static final long PERIOD_DAY = DateUtils.MILLIS_IN_DAY; //一周的毫秒数 public static final long PERIOD_WEEK = PERIOD_DAY * 7; //无延迟 public static final long NO_DELAY = 0; //定时器 private Timer timer; /** * 在Web应用结束时停止任务 */ public void contextDestroyed(ServletContextEvent sce) { timer.cancel();//定时器销毁 } /** * 在Web应用启动时初始化任务 */ public void contextInitialized(ServletContextEvent sce) { //定义定时器 timer = new Timer(true); //timer.schedule(new LocationTask(), NO_DELAY, PERIOD_WEEK * 4); // timer.schedule(new figureTermCount(), NO_DELAY, 30000); } } 二 创建本地要执行的任务类方法 import java.util.TimerTask; public class LocationTask extends TimerTask { private static boolean isRunning = false; @Override public void run() { if(!isRunning) { isRunning = true; //------要执行的程序块-------- isRunning = false; } else { //------要执行的程序块-------- } } } 三 在web.xml中配置监听器 <listener> <listener-class>com.sxy.sms.util.timerManager</listener-class> </listener> 第一种方式到这里算结束了 。下面看第二种 引用 网上的第二种说法。 1、 既然我们使用了Spring,所以不一定要extends TimerTask类来定义一个Task,Spring也可以使用MethodInvokingTimerTaskFactoryBean类直接指定执行某个对象的方法. 2、 MyTask.java 此类无需extends TimerTask类 public class MyTask { public void execute() { System.out.println("开始我的任务"); //编写逻辑代码 } } applicationcontext.xml <bean id="myTask" class="com.huawei.esop.MyTask" /> <!-- 定义任务对象和方法 --> <bean id="timerTaksBean" class="org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean"> <property name="targetObject" ref="myTask"></property> <property name="targetMethod" value="execute"></property> </bean> <!-- 任务的执行 --> <bean id="scheduledTimerTask" class="org.springframework.scheduling.timer.ScheduledTimerTask"> <property name="timerTask" ref="timerTaksBean"></property> <property name="period" value="1000"></property> <property name="delay" value="1000"></property> </bean> <!-- 注册任务 --> <bean id="timerFactoryBean" class="org.springframework.scheduling.timer.TimerFactoryBean"> <property name="scheduledTimerTasks"> <list> <ref bean="scheduledTimerTask" /> </list> </property> </bean> 我下面同样给出例子。 applicationContext.xml beans中添加如下代码 class 做相应配置 <bean id="myTask" class="com.sxy.sms.task.figureTermCount" /> <!-- 定义任务对象和方法 --> <bean id="timerTaksBean" class="org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean"> <property name="targetObject" ref="myTask"></property> <property name="targetMethod" value="execute"></property> </bean> <!-- 任务的执行 --> <bean id="scheduledTimerTask" class="org.springframework.scheduling.timer.ScheduledTimerTask"> <property name="timerTask" ref="timerTaksBean"></property> <property name="period" value="1000"></property> <property name="delay" value="1000"></property> </bean> <!-- 注册任务 --> <bean id="timerFactoryBean" class="org.springframework.scheduling.timer.TimerFactoryBean"> <property name="scheduledTimerTasks"> <list> <ref bean="scheduledTimerTask" /> </list> </property> </bean> 二 要执行的定时方法类 不要继承(extends) TimerTask 类 这也是跟第一种方式不同之处 public class figureTermCount { public void execute() { System.out.println("开始我的任务"); //编写逻辑代码 } } 三 把你在web.xml中的定时服务类的监听器配置注释或删掉 个人觉得第二种更方便更好看看看看些 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |