摘要:
在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,王安琪)