首页 > 代码库 > 分享Spring Scheduled定时器的用法

分享Spring Scheduled定时器的用法

摘要:在coding中经常会用到定时器,指定每隔1个小时,或是每天凌晨2点执行一段代码段,若是使用java.util.Timer来做这种事情,未免重复造轮子。幸亏Spring中封装有定时器,而且非常好用,采用注解的形式配置某时某刻执行一段代码段。在之前的项目中使用过一次,下面就把代码、配置一并分享与大家
关键词:Spring, JAVA, Scheduled, 定时器

一、
首先写一个Handler接口(“定时器Handler”),用以说明实现这一接口的类做的处理逻辑都是由定时器驱动的。
 1 /* 2  *文件名:ITimeFlickerHandler.java 3  *版权:王安琪 4  *描述:时钟消息处理接口 5  *修改时间:2014-01-13 6  *修改内容:新增 7  */ 8  9 public interface ITimeFlickerHandler {10 11     void handle();12 }
 
二、
编写定时器驱动,设置某时某刻执行哪些代码,从而驱动“定时器Handler”
 1 /* 2  *文件名:TimeFlicker.java 3  *版权:王安琪 4  *描述:时钟触发源 5  *修改时间:2014-01-13 6  *修改内容:新增 7  */ 8  9 import java.util.ArrayList;10 import java.util.List;11 12 import org.slf4j.Logger;13 import org.slf4j.LoggerFactory;14 import org.springframework.scheduling.annotation.Scheduled;15 16 /**17  * 时钟触发源18  * 19  * @author wanganqi20  * 21  */22 public class TimeFlicker {23 24     private static final Logger logger = LoggerFactory25             .getLogger(LocatingSourceFilter.class);26 27     private List<ITimeFlickerHandler> handlers = new ArrayList<ITimeFlickerHandler>();28 29     /**30      * 通过配置文件获取要调用的时钟消息处理类31      * 32      * @return33      */34     public List<ITimeFlickerHandler> getHandlers() {35         return handlers;36     }37 38     public void setHandlers(List<ITimeFlickerHandler> handlers) {39         this.handlers = handlers;40     }41 42     // 每一个小时30分00秒执行处理43     @Scheduled(cron = "0 30 * * * ?")44     public void run() {45         for (ITimeFlickerHandler handler : handlers) {46             handler.handle();47         }48     }49 }
 
三、
实现“定时器Handler”接口,实现定时器事件触发时的处理逻辑。
 1 /* 2  *文件名:Monitor.java 3  *版权:王安琪 4  *描述:监控处理 5  *修改时间:2013-12-10 6  *修改内容:新增 7  */ 8  9 import org.slf4j.Logger;10 import org.slf4j.LoggerFactory;11 12 public class Monitor implements ITimeFlickerHandler {13 14     private static final Logger logger = LoggerFactory15             .getLogger(LocatingSourceFilter.class);16 17     /**18      * 定时时间到,更新所有电子围栏缓存19      * 20      * @see ITimeFlickerHandler#handle()21      */22     @Override23     public void handle() {24         EF[] res = null;25         try {26             res = service.GetEF();27         } catch (Exception e) {28             logger.error("This is error message");29         }30         EFB.setBuffer(res);31     }32 }
 
四、
配置Spring,注入“定时器Handler”,Spring配置文件bean.xml如下。
 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     xmlns:task="http://www.springframework.org/schema/task" 5     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 6         http://www.springframework.org/schema/task  http://www.springframework.org/schema/task/spring-task-3.1.xsd  "> 7  8     <!-- 处理器相关 --> 9     <task:annotation-driven />10     <bean id="Monitor"11         class="com.imp.Monitor" />12     <bean id="TimeFlicker" class="com.imp.TimeFlicker">13         <property name="handlers">14             <list>15                 <ref bean="Monitor" />16             </list>17         </property>18     </bean>19 </beans>


五、

生成、获取Spring应用上下文,并编写测试用例......。
 1 import org.springframework.context.support.AbstractApplicationContext; 2 import org.springframework.context.support.FileSystemXmlApplicationContext; 3  4 public class AppContext { 5  6     private static AbstractApplicationContext dispatchContext; 7  8     /** 9      * 以单例模式获取上下文10      * 11      * @return 上下文12      */13     public static AbstractApplicationContext getDispatchContext() {14         if (dispatchContext == null)15             dispatchContext = new FileSystemXmlApplicationContext(16                     "classpath:bean.xml");17         return dispatchContext;18     }19 }
这个定时器真是简洁又极其有用的,至今还没有发现它有什么缺点,不知道C#中有没有这么一个小工具,能提高代码编写效率,知晓之人可以告之。
 

如有引用,请注明来自 http://www.cnblogs.com/wgp13x/ ,另外推荐一篇我刚写的博客:

如何写一篇论文,<一种低耗能的数据融合隐私保护算法ESPART> (计算机学报2011-5,王安琪)



来自王安琪(http://www.cnblogs.com/wgp13x/p/3885665.html)