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

一、
首先写一个Handler接口(“定时器Handler”),用以说明实现这一接口的类做的处理逻辑都是由定时器驱动的。
 /*
*文件名:ITimeFlickerHandler.java
*版权:王安琪
*描述:时钟消息处理接口
*修改时间:2014-01-13
*修改内容:新增
*/ public interface ITimeFlickerHandler { void handle();
}
 
二、
编写定时器驱动,设置某时某刻执行哪些代码,从而驱动“定时器Handler”。
 /*
*文件名:TimeFlicker.java
*版权:王安琪
*描述:时钟触发源
*修改时间:2014-01-13
*修改内容:新增
*/ import java.util.ArrayList;
import java.util.List; import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled; /**
* 时钟触发源
*
* @author wanganqi
*
*/
public class TimeFlicker { private static final Logger logger = LoggerFactory
.getLogger(LocatingSourceFilter.class); private List<ITimeFlickerHandler> handlers = new ArrayList<ITimeFlickerHandler>(); /**
* 通过配置文件获取要调用的时钟消息处理类
*
* @return
*/
public List<ITimeFlickerHandler> getHandlers() {
return handlers;
} public void setHandlers(List<ITimeFlickerHandler> handlers) {
this.handlers = handlers;
} // 每一个小时30分00秒执行处理
@Scheduled(cron = "0 30 * * * ?")
public void run() {
for (ITimeFlickerHandler handler : handlers) {
handler.handle();
}
}
}
 
三、
实现“定时器Handler”接口,实现定时器事件触发时的处理逻辑。
 /*
*文件名:Monitor.java
*版权:王安琪
*描述:监控处理
*修改时间:2013-12-10
*修改内容:新增
*/ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; public class Monitor implements ITimeFlickerHandler { private static final Logger logger = LoggerFactory
.getLogger(LocatingSourceFilter.class); /**
* 定时时间到,更新所有电子围栏缓存
*
* @see ITimeFlickerHandler#handle()
*/
@Override
public void handle() {
EF[] res = null;
try {
res = service.GetEF();
} catch (Exception e) {
logger.error("This is error message");
}
EFB.setBuffer(res);
}
}
 
四、
配置Spring,注入“定时器Handler”,Spring配置文件bean.xml如下。
 <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.1.xsd "> <!-- 处理器相关 -->
<task:annotation-driven />
<bean id="Monitor"
class="com.imp.Monitor" />
<bean id="TimeFlicker" class="com.imp.TimeFlicker">
<property name="handlers">
<list>
<ref bean="Monitor" />
</list>
</property>
</bean>
</beans>

五、

生成、获取Spring应用上下文,并编写测试用例......。
 import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext; public class AppContext { private static AbstractApplicationContext dispatchContext; /**
* 以单例模式获取上下文
*
* @return 上下文
*/
public static AbstractApplicationContext getDispatchContext() {
if (dispatchContext == null)
dispatchContext = new FileSystemXmlApplicationContext(
"classpath:bean.xml");
return dispatchContext;
}
}
这个定时器真是简洁又极其有用的,至今还没有发现它有什么缺点,不知道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. The “SignFile” task was not given a value for the required parameter “CertificateThumbprint”的一个简单的解决方法

    这个只是其中一种解决方法,而且不是万能的 1. 由提示内容可以看出,这个一个 sign(认证)的问题, 在出现这个问题的项目上,鼠标右键,选择properties,然后选择signing. 2. 选择 ...

  2. 攻克数据库核心技术壁垒,实现百万级QPS的高吞吐

    CynosDB是腾讯云自研的新一代高性能高可用的企业级分布式云数据库.融合了传统数据库.云计算与新硬件的优势,100%兼容开源数据库,百万级QPS的高吞吐,不限存储,价格仅为商用数据库的1/10. C ...

  3. java.net.SocketException四大异常解决方案---转

    java.net.SocketException如何才能更好的使用呢?这个就需要我们先要了解有关这个语言的相关问题.希望大家有所帮助.那么我们就来看看有关java.net.SocketExceptio ...

  4. addEventListener()和removeEventListener()

    作用: addEventListener()与removeEventListener()用于处理指定和删除事件处理程序操作. 它们都接受3个参数:事件名.事件处理的函数和布尔值. 布尔值参数是true ...

  5. 阿里云服务器centos6.x升级内核以能安装docker

    centos版本为6.9,因为需要安装docker,所以需要将内核升级 升级步骤: 先导入公钥: rpm --import https://www.elrepo.org/RPM-GPG-KEY-elr ...

  6. SSIS教程:创建简单的ETL包 -- 2. 添加循环(Adding Looping)

    在第 1 课:创建项目和基本包中,创建了从单个平面文件源中提取数据的包,然后使用查找转换功能对数据进行了转换,最后将数据加载到AdventureWorksDW2012 示例数据库的 FactCurre ...

  7. mycat核心概念

    一.逻辑库(schema) 业务人员一般是不需要知道数据库中间件的,他们只需要连接到数据库并使用数据库,一切复杂的细节都被中间件给隐藏了,对于业务人员来说中间件即是一个数据库.这里逻辑库的概念就是一个 ...

  8. js判断值是否是数字

    js如何判断值是否是数字 1. isNaN()方法2. 正则表达式var re = /^[0-9]+.?[0-9]*$/; //判断字符串是否为数字 //判断正整数 /^[1-9]+[0-9]*]*$ ...

  9. Csharp:WebClient and WebRequest use http download file

    //Csharp:WebClient and WebRequest use http download file //20140318 塗聚文收錄 string filePath = "20 ...

  10. 1004. 填充矩形 (Standard IO)

    题目描述 已知矩形的大小为n×m,现用a×a的正方形填充该矩形.输入三个正整数n,m,a(n,m,a≤10^9),计算至多能填入多少正方形?(正方形可以正好碰到矩形边界,但不能超出矩形外) 输入 一行 ...