zoukankan      html  css  js  c++  java
  • 分享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 wanganqi
    20  * 
    21  */
    22 public class TimeFlicker {
    23 
    24     private static final Logger logger = LoggerFactory
    25             .getLogger(LocatingSourceFilter.class);
    26 
    27     private List<ITimeFlickerHandler> handlers = new ArrayList<ITimeFlickerHandler>();
    28 
    29     /**
    30      * 通过配置文件获取要调用的时钟消息处理类
    31      * 
    32      * @return
    33      */
    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 = LoggerFactory
    15             .getLogger(LocatingSourceFilter.class);
    16 
    17     /**
    18      * 定时时间到,更新所有电子围栏缓存
    19      * 
    20      * @see ITimeFlickerHandler#handle()
    21      */
    22     @Override
    23     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,王安琪)





  • 相关阅读:
    02 make和目录结构
    05 UCI
    IE6下position:fixed不固定的解决办法
    php内存溢出
    MySQL计划任务(事件调度器)(Event Scheduler)
    PHP面向对象
    php学习笔记——12年2月16日开始不断更新
    Phpnow下配置Xdebug调试
    边学边用
    ASP时间格式化函数
  • 原文地址:https://www.cnblogs.com/wgp13x/p/3885665.html
Copyright © 2011-2022 走看看