原文:http://www.open-open.com/code/view/1426250803279

本文讲的是通过Spring注解的方式实现任务调度。只要引入了spring-context包就能够在项目中使用注解方式的任务调度。

下面看具体配置

需要在Spring配置文件中加入task的schema。

<xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-4.0.xsd"

然后在启用注解支持

<task:annotation-driven />

然后在代码中就可以直接用了,要定时执行的方法必须是void的,并且没有任何参数的。

@Override
@Scheduled(cron="0 0 2 * * ?")
@Transactional(rollbackFor=Exception.class)
public void excute() throws DXPException

cron表达式请自行问百度,下面只列出几个从网上找的例子

CRON表达式 含义

“0 0 12 * * ?” 每天中午十二点触发
“0 15 10 ? * *” 每天早上10:15触发
“0 15 10 * * ?” 每天早上10:15触发
“0 15 10 * * ? *” 每天早上10:15触发
“0 15 10 * * ? 2005” 2005年的每天早上10:15触发
“0 * 14 * * ?” 每天从下午2点开始到2点59分每分钟一次触发
“0 0/5 14 * * ?” 每天从下午2点开始到2:55分结束每5分钟一次触发
“0 0/5 14,18 * * ?” 每天的下午2点至2:55和6点至6点55分两个时间段内每5分钟一次触发
“0 0-5 14 * * ?” 每天14:00至14:05每分钟一次触发
“0 10,44 14 ? 3 WED” 三月的每周三的14:10和14:44触发
“0 15 10 ? * MON-FRI” 每个周一、周二、周三、周四、周五的10:15触发

通过AOP监控方法的执行情况,并保存到数据库中

package com.tiamaes.gjds.dxp.aop;

import java.util.Date;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired; import com.tiamaes.gjds.dxp.annotation.Task;
import com.tiamaes.gjds.dxp.bean.TbScheduledExcuteLog;
import com.tiamaes.gjds.dxp.repository.TbScheduledExcuteLogRepository;
import com.tiamaes.gjds.dxp.task.DxpScheduled; /**
* <p>类描述:通过AOP监控方法的执行情况,并保存到数据库中</p>
* <p>创建人:王成委 </p>
* <p>创建时间:2015年2月28日 上午9:40:18 </p>
* <p>版权说明: © 2015 Tiamaes </p>
*/
@Aspect
public class ScheduledStatisticsHandler { @Autowired
private TbScheduledExcuteLogRepository tbScheduledExcuteLogRepository; @Pointcut("@annotation(org.springframework.scheduling.annotation.Scheduled)")
public void proxyAspect() { } @Around("proxyAspect()")
public Object doInvoke(ProceedingJoinPoint joinPoint) throws Throwable{
Date date = new Date();
long start = System.currentTimeMillis();
Object result = joinPoint.proceed();
long end = System.currentTimeMillis();
Object target = joinPoint.getTarget(); TbScheduledExcuteLog log = new TbScheduledExcuteLog();
log.setClassName(joinPoint.getTarget().getClass().getName());
log.setConsum(end-start);
log.setExcuteDate(date);
log.setExcuteTime(date);
log.setIsError(false);
if (target instanceof DxpScheduled) {
DxpScheduled scheduled = (DxpScheduled) target;
Task task = scheduled.getClass().getAnnotation(Task.class);
log.setContentName(task.value());
log.setRemark(scheduled.getTaskExcuteInfo());
log.setGetRecCount(scheduled.getRemoteCount());
log.setSyncRecCount(scheduled.getSyncCount());
} this.tbScheduledExcuteLogRepository.save(log); return result;
}
}

通过AOP记录执行时发生异常的任务

package com.tiamaes.gjds.dxp.aop;

import java.util.Date;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired; import com.tiamaes.gjds.dxp.annotation.Task;
import com.tiamaes.gjds.dxp.bean.TbScheduledExcuteLog;
import com.tiamaes.gjds.dxp.dao.TbScheduledExcuteLogDao;
import com.tiamaes.gjds.dxp.exception.DXPException;
import com.tiamaes.gjds.dxp.task.DxpScheduled;
import com.tiamaes.gjds.util.ExceptionTools; /**
* <p>类描述: 处理任务执行时法伤的异常 </p>
* <p>创建人:王成委 </p>
* <p>创建时间:2015年2月28日 下午4:24:54 </p>
* <p>版权说明: © 2015 Tiamaes </p>
*/
@Aspect
public class ScheduleExceptionHandler { @Autowired
private TbScheduledExcuteLogDao tbScheduledExcuteLogDao; @Pointcut("@annotation(org.springframework.scheduling.annotation.Scheduled)")
public void proxyAspect() { } @AfterThrowing(pointcut="proxyAspect()",throwing="ex")
public void doException(JoinPoint joinPoint,Exception ex){
Object target = joinPoint.getTarget();
this.saveException(target, ex);
} public void saveException(Object target,Exception ex){
try {
Date date = new Date();
TbScheduledExcuteLog log = new TbScheduledExcuteLog();
log.setClassName(target.getClass().getName());
log.setExcuteDate(date);
log.setExcuteTime(date);
log.setIsError(true);
log.setErrorInfo(ExceptionTools.getExceptionDetails(ex).toString());
if (target instanceof DxpScheduled) {
DxpScheduled scheduled = (DxpScheduled) target;
Task task = scheduled.getClass().getAnnotation(Task.class);
log.setContentName(task.value());
}
this.tbScheduledExcuteLogDao.saveAndCommit(log);
} catch (DXPException e) {
e.printStackTrace();
}
}
}

其中Task注解为标注任务的名称,方便在数据库中保存。

使用Spring定时任务并且通过AOP监控任务执行情况的更多相关文章

  1. spring定时任务配置,以及不执行的解决办法

    前几天,同事问了我一个问题,我告诉他用spring的定时任务解决,并给他配置了spring的定时任务.当时随便找了一个bean写了一段代码,验证定时任务正确执行后,就没再管,昨天下午,同事写代码的时候 ...

  2. ASP.NET 多线程 监控任务执行情况,并显示进度条

    关于多线程的基本概念和知识在本文中不多讲,而且我懂的也不是很透,说的太多误人子弟...对于我来说,做本文提到的功能够用就行,等实现其他效果不够用的时候,再深入研究 推荐看园子里的两篇博客应该就有个基本 ...

  3. Spring整合Quartz定时任务执行2次,Spring定时任务执行2次

    Spring整合Quartz定时任务执行2次,Spring定时任务执行2次 >>>>>>>>>>>>>>>&g ...

  4. 解决spring定时任务执行2次和tomcat部署缓慢的问题

    spring定时任务执行2次 问题重现和解析 最近使用quartz定时任务框架,结果发现开发环境执行无任何问题,部署到服务器上后,发现同一时间任务执行了多次.经过搜索发现是服务器上tomcat的配置文 ...

  5. spring多个AOP执行先后顺序(面试问题:怎么控制多个aop的执行循序)

    转载:spring多个AOP执行先后顺序(面试问题:怎么控制多个aop的执行循序) 众所周知,spring声明式事务是基于AOP实现的,那么,如果我们在同一个方法自定义多个AOP,我们如何指定他们的执 ...

  6. spring定时任务执行两次的原因与解决方法

    spring定时任务,本地执行一次,放到服务器上后,每次执行时会执行两次,原因及解决办法. http://blog.csdn.net/yaobengen/article/details/7031266 ...

  7. 如何在Spring Boot 中动态设定与执行定时任务

    本篇文章的目的是记录并实现在Spring Boot中,动态设定与执行定时任务. 我的开发项目是 Maven 项目,所以首先需要在 pom.xml 文件中加入相关的依赖.依赖代码如下所示: <de ...

  8. Spring Aop的执行顺序

    Spring Aop的执行顺序 首先回忆一下 AOP 的常用注解 @Before:前置通知:目标方法之前执行 @After:后置通知:目标方法之后执行 @AfterReturning:返回后通知:执行 ...

  9. Spring Boot 创建定时任务(配合数据库动态执行)

    序言:创建定时任务非常简单,主要有两种创建方式:一.基于注解(@Scheduled) 二.基于接口(SchedulingConfigurer). 前者相信大家都很熟悉,但是实际使用中我们往往想从数据库 ...

随机推荐

  1. itop安装中使用nginx安装后不能出现enter itop的问题

    安装中没有出现enter itop,  如下的网络请求给了我们原因 原来使用的是域名请求资源文件,而该域名并不能指向我的服务器,所以安装中资源文件请求不成功,查看了我的nginx配置,如下 [ro ...

  2. Urlrewritefilte

    Urlrewritefilter是通过filter的形式,过滤所有的请求,然后再根据配置文件来转换成真正要访问的URL. 好处是隐藏真正的URL和美化提供给客户的URL. 比如,你的首页是www.** ...

  3. Android(java)学习笔记158:多线程断点下载的原理(JavaSE实现)

    1. 为什么需要多线程下载?     服务器的资源有限,同时的平均地分配给每个客户端.开启的线程越多抢占的服务的资源就越多,下载的速度就越块. 2. 下载速度的限制条件? (1)你的电脑手机宽带的带宽 ...

  4. hdu5792 World is Exploding(多校第五场)树状数组求逆序对 离散化

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=5792 题目描述:给你n个值,每个值用A[i]表示,然后问你能否找到多少组(a,b,c,d)四个编号,四 ...

  5. Wikidata和SparQL简介

    知识库 数据库(Database)和SQL,相信我们大部分人都非常非常熟悉.但是“知识库”可能知道的人就要相对少一些. 知识库是一个相对比较新的概念,它其实是一堆“三元组”(类似于主-谓-宾)的组合, ...

  6. aapt环境变量配置

    D:\android-sdk_r24.4.1-windows\android-sdk-windows\build-tools\28.0.2 将aapt路径添加到path中, 打开cmd 输入aapt

  7. Java数据结构和算法(三)--三大排序--冒泡、选择、插入排序

    三大排序在我们刚开始学习编程的时候就接触过,也是刚开始工作笔试会遇到的,后续也会学习希尔.快速排序,这里顺便复习一下 冒泡排序: 步骤: 1.从首位开始,比较首位和右边的索引 2.如果当前位置比右边的 ...

  8. JS常用字符串处理方法应用总结

    这篇文章主要总结了JS常用字符串的处理方法,需要的朋友可以参考下   1.indexOf()方法,从前往后查找字符串位置,大小写敏感,从0开始计数.同理,lastIndexOf() 方法从后往前,两个 ...

  9. HNOI2006 潘多拉的盒子

    题目描述 题解: 题目的描述比较长,理解起来也有一定难度.仔细读题后我们发现整个任务可以分成两个部分:找出咒语机之间所有的升级关系.求最长升级序列. 1. 求升级关系: 容易看出,咒语机i可以抽象成一 ...

  10. python3.x Day6 协程

    协程:#定义来自牛人alex博客协程,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程:协程是一种用户态的轻量级线程.协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈 ...