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

分享Spring Scheduled定时器的用法的更多相关文章

  1. Spring Boot使用@Scheduled定时器任务

      摘要: Spring Boot之使用@Scheduled定时器任务 假设我们已经搭建好了一个基于Spring Boot项目,首先我们要在Application中设置启用定时任务功能@EnableS ...

  2. Spring Boot 使用@Scheduled定时器任务

    摘要: Spring Boot之使用@Scheduled定时器任务 假设我们已经搭建好了一个基于Spring Boot项目,首先我们要在Application中设置启用定时任务功能@EnableSch ...

  3. Spring @Scheduled应用解析

    最近,遇到的一个需求,需要执行定时任务,每个一定时间需要执行某个方法 因为项目是SpringMVC的项目,所以使用的是Spring @Scheduled(由于quartz应用起来太麻烦,所以没有采用) ...

  4. 使用轻量级Spring @Scheduled注解执行定时任务

    WEB项目中需要加入一个定时执行任务,可以使用Quartz来实现,由于项目就一个定时任务,所以想简单点,不用去配置那些Quartz的配置文件,所以就采用了Spring @Scheduled注解来实现了 ...

  5. Spring任务调度定时器

    1.在spring-context.xml配置 <!-- 计划任务配置,用 @Service @Lazy(false)标注类,用@Scheduled(cron = "0 0 2 * * ...

  6. javascript中window与document对象、setInterval与setTimeout定时器的用法与区别

    一.写在前面 本人前端菜鸟一枚,学习前端不久,学习过程中有很多概念.定义在使用时容易混淆,在此给向我一样刚踏入前端之门的童鞋们归纳一下.今天给大家分享一下js中window与document对象.se ...

  7. spring计划任务,springMvc计划任务,Spring@Scheduled,spring定时任务

    spring计划任务,springMvc计划任务,Spring@Scheduled,spring定时任务 >>>>>>>>>>>> ...

  8. Spring MVC RedirectAttributes的用法解决办法

    Spring MVC RedirectAttributes的用法很久没发过技术贴了,今天对于一个问题纠结了2小时,遂放弃研究用另一种方法解决,奈何心中一直存在纠结,发帖求解 我先解释下什么是Redir ...

  9. 框架源码系列十:Spring AOP(AOP的核心概念回顾、Spring中AOP的用法、Spring AOP 源码学习)

    一.AOP的核心概念回顾 https://docs.spring.io/spring/docs/5.1.3.RELEASE/spring-framework-reference/core.html#a ...

随机推荐

  1. 在ubuntu下使用Eclipse搭建Hadoop开发环境

    一.安装准备1.JDK版本:jdk1.7.0(jdk-7-linux-i586.tar.gz)2.hadoop版本:hadoop-1.1.1(hadoop-1.1.1.tar.gz)3.eclipse ...

  2. 设置 mysql允许外网访问

    mysql的root账户,我在连接时通常用的是localhost或127.0.0.1,公司的测试服务器上的mysql也是localhost所以我想访问无法访问,测试暂停. 解决方法如下: 1,修改表, ...

  3. Go的接口总结

    一.什么是接口 接口类型是一种抽象的类型,它描述了一系列方法的集合. 接口约定:接口类型中定义的方法即为约定,若一个具体类型实现了所有这些方法,则该类型就满足该接口的约定,或者说它是这个接口类型的实例 ...

  4. ansible roles 目录规范

    我的ansible roles项目的目录结构: (ansible_venv) [root@localhost ansible_home]# tree ansible_playbooks/ ansibl ...

  5. [android] 练习样式主题自定义activity切换动画

    主要练习了自定义样式和主题,继承android系统默认的样式并修改,练习xml定义淡入淡出动画 anim/fade_in.xml <?xml version="1.0" en ...

  6. Thread 的join方法

    package com.cn.test.thread; public class TestJoin extends Thread{ private String name; public TestJo ...

  7. 希尔排序——Python实现

    一.排序思想 希尔排序思想请参见:https://www.cnblogs.com/luomeng/p/10592830.html 二.python实现 def shellSort(arr): &quo ...

  8. hdu Anniversary party 树形DP,点带有值。求MAX

    Anniversary party Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  9. 廖雪峰JavaScript练习题3

    请尝试写一个验证Email地址的正则表达式.版本一应该可以验证出类似的Email: 正则表达式: <!DOCTYPE html> <html> <head> < ...

  10. kotlin语法

    https://try.kotlinlang.org/#/Examples/Hello,%20world!/Simplest%20version/Simplest%20version.kt /** * ...