使用Spring定时任务并且通过AOP监控任务执行情况
原文: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监控任务执行情况的更多相关文章
- spring定时任务配置,以及不执行的解决办法
前几天,同事问了我一个问题,我告诉他用spring的定时任务解决,并给他配置了spring的定时任务.当时随便找了一个bean写了一段代码,验证定时任务正确执行后,就没再管,昨天下午,同事写代码的时候 ...
- ASP.NET 多线程 监控任务执行情况,并显示进度条
关于多线程的基本概念和知识在本文中不多讲,而且我懂的也不是很透,说的太多误人子弟...对于我来说,做本文提到的功能够用就行,等实现其他效果不够用的时候,再深入研究 推荐看园子里的两篇博客应该就有个基本 ...
- Spring整合Quartz定时任务执行2次,Spring定时任务执行2次
Spring整合Quartz定时任务执行2次,Spring定时任务执行2次 >>>>>>>>>>>>>>>&g ...
- 解决spring定时任务执行2次和tomcat部署缓慢的问题
spring定时任务执行2次 问题重现和解析 最近使用quartz定时任务框架,结果发现开发环境执行无任何问题,部署到服务器上后,发现同一时间任务执行了多次.经过搜索发现是服务器上tomcat的配置文 ...
- spring多个AOP执行先后顺序(面试问题:怎么控制多个aop的执行循序)
转载:spring多个AOP执行先后顺序(面试问题:怎么控制多个aop的执行循序) 众所周知,spring声明式事务是基于AOP实现的,那么,如果我们在同一个方法自定义多个AOP,我们如何指定他们的执 ...
- spring定时任务执行两次的原因与解决方法
spring定时任务,本地执行一次,放到服务器上后,每次执行时会执行两次,原因及解决办法. http://blog.csdn.net/yaobengen/article/details/7031266 ...
- 如何在Spring Boot 中动态设定与执行定时任务
本篇文章的目的是记录并实现在Spring Boot中,动态设定与执行定时任务. 我的开发项目是 Maven 项目,所以首先需要在 pom.xml 文件中加入相关的依赖.依赖代码如下所示: <de ...
- Spring Aop的执行顺序
Spring Aop的执行顺序 首先回忆一下 AOP 的常用注解 @Before:前置通知:目标方法之前执行 @After:后置通知:目标方法之后执行 @AfterReturning:返回后通知:执行 ...
- Spring Boot 创建定时任务(配合数据库动态执行)
序言:创建定时任务非常简单,主要有两种创建方式:一.基于注解(@Scheduled) 二.基于接口(SchedulingConfigurer). 前者相信大家都很熟悉,但是实际使用中我们往往想从数据库 ...
随机推荐
- java-基于泛型和反射机制的通用比较器实现
一.前言 Java的比较器是用来对List集合进行排序用的,分为内部比较器和外部比较器两类 内部比较器:被排序的类要 implements Comparable 类,并实现compareTo方法. 外 ...
- uva1613 K-Graph Oddity
题目要求k>=最大度数:观察,颜色数量和度数的关系,得颜色数=最大度数+1(偶数)//最大度数(奇数) 可以满足染色关系一个点和周围的点的颜色数加起来最大为它的度数+1: k=所有点中最大的度. ...
- b继承a的函数
var cls={ my:, init:function() { alert(this.my.a); }};window.onload=function(){ cls.init();} 调用cls.i ...
- PHP06 流程控制
学习要点 选择结构 循环结构 学习目标 掌握PHP的选择结构 掌握PHP的循环结构 流程控制概述 程序 程序:一系列计算机指令的集合. 编程语言:开发程序的工具. 程序执行结构 计算机程序有三种基本执 ...
- HTML中pre标签的用法
我们经常会在要保持文本格式的时候使用pre标签,比如当我们要展示源代码的时候,只要放一个pre标签,然后把源代码直接复制,粘贴,然后在页面上就可以保持好格式.不会像放在其它标签里那样,把换行和空格都自 ...
- springmvc下载那些事
文件的上传下载一般在项目中还是非常实用的,此处专门整理一下文件的下载,至于文件的上传实现将在后续中补上.文件的下载多用于模板文件的下载,这在项目中用的还是挺多的.今天用到了就整理出来了,以供搬运工们借 ...
- Docker客户端连接Docker Daemon的方式
Docker为C/S架构,服务端为docker daemon,客户端为docker.service,支持本地unix socket域套接字通信与远程socket通信. 默认为本地unix socket ...
- ubuntu mysql配置方案
Ubuntu常用服务器环境搭建--MySQL篇 MySQL 1.安装MySQL apt-get update apt-get install mysql-server 2.配置MySQL vi /et ...
- tornado框架基础04-模板基础
01 模板 模板演示 配置路径 在 application 中配置模板文件和静态文件的路径: template_path='templates', static_path='static', 模板 & ...
- Rust所有权语义模型
编程语言的内存管理,大概可以分为自动和手动两种. 自动管理就是用 GC(垃圾回收)来自动管理内存,像 Java.Ruby.Golang.Elixir 等语言都依赖于 GC.而 C/C++ 却是依赖于手 ...