分享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,王安琪)
王安琪,英文名Angel,南京邮电大学计算机应用技术硕士学位。 熟悉Java、C#编程语言。专注于WebService、海量数据处理、搜索引擎技术、消息中间件技术、分布式文件存储、.NET应用程序开发、系统架构设计。主要从事大数据管理系统的研发,项目经理,系统架构师,就职于江苏金陵科技集团有限公司。
Email:aitanjupt@hotmail.com
QQ:289770363