前段时间有几个同行跟我吐槽说系统响应越来越慢,优化不知道从何入手!今天写写使用spring的aop来实现方法级的执行时间的记录监控,以此来评估方法的性能以及针对性的对已存在的方法进行优化。

对于监控,我们比较关注监控的可靠性和性能,准确,高效,这才能在不影响整体性能的情况下对我们的系统性能有个较准确的认识。

对于spring aop这个我就不多介绍了,网上一搜一大把,使用过spring的人都知道spring的ioc和aop。ioc我们常用,但在我们自己的系统中,aop的使用几乎为零,除了这个监控的小功能应用到了,其他的基本上没有使用到。

我们使用BeanNameAutoProxyCreator,指定bean的名称,以及被通知bean的名称,指定名称时可以使用通配符自动代理它们,配置如下

<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">  <property name="proxyTargetClass">  <value>true</value>  </property>  <property name="interceptorNames">  <list>  <idref bean="profilerInterceptor"/>  </list>  </property>  <property name="beanNames">  <list>  <value>*Service</value>  <value>*ServiceImpl</value>  <value>*Manager</value>  <value>*ManagerImpl</value>  <value>*Dao</value>  </list>  </property>  </bean>     

上面的配置文件我们配置了一个idref bean,这个就是我们需要写的监控逻辑的代码。interceptor是个拦截器,上面的这个配置的所反应出来的内容是,写自己的一个拦截器来拦截后缀为Service,ServiceImpl,Manager,ManagerImpl,Dao的类,至于是类拦截还是方法级别的拦截,那就要看我们的拦截器的逻辑和代码了。

说说拦截器的实现。我们希望拦截器在对方法的执行时间进行记录的同时,还要进行日志的输出,如,执行时间超过500ms的方法,我们要打印出内部执行每个方法的耗时,这样我们可以对执行的慢的方法一目了然,优化时也不需要耗很多的时间去logger到底是哪里执行的慢了。所以在拦截器中,我们增加一个整形的属性,这个属性用来配置需要打印到日志中超过配置时间的执行方法的耗时情况。得到像下面一样的一个日志输出:

[4359, 2, 100%, 0]com.profile.service.impl.OrderServiceImpl.findRecentlyProfile
+---[4357, 4357, 99%, 1]com.profile.dao.GenericMybatisDao.queryPage  

第一行表示整个方法执行的总耗时,下一行表示在这个方法中存在的其他受监控的方法耗时。这就很容易让我们知道,是执行SQL所耗的时间,需要对SQL进行优化。

那到底该怎么样去实现,展示拦截器中的部分代码。拦截器继承AbstractMonitoringInterceptor类,它是一个方法级别的拦截器,实现了 MethodInterceptor 接口。

protected Object invokeUnderTrace(MethodInvocation invocation, Log logger) throws Throwable {  String name = createInvocationTraceName(invocation);  //是否委托了注解的拦截  boolean isExistsPrintProfiler = PrintProfilerHelper.isMethodExistsPrintProfiler(invocation.getMethod());  try {  if (!isExistsPrintProfiler) {  Profiler.start(name, monitorTime);  }  return invocation.proceed();  } finally {  if (!isExistsPrintProfiler) {  Profiler.stop(name);  }  }  }  public int getMonitorTime() {  return monitorTime;  }  public void setMonitorTime(int monitorTime) {  this.monitorTime = monitorTime;  }  

拦截器中的代码非常简单,简单到10几行代码。这对我们来说是件好事。在Profiler这个类中,我们进行了一些监控,鉴于我们输出上面所描述的日志的tree格式的日志文件,我们在Profiler中使用了TheadLocal来对执行的方法进行管理,这样会将代码变的非常简单。Profiler的start方法也就10行代码

private final static ThreadLocal<ExecData> dataHolder = new ThreadLocal<ExecData>();  public static void start(String logName) {  start(logName, ELAPSE_TIME_MS_TO_LOG);
}  public static void start(String logName, int elapseTimeMsToLog) {  ExecData execData = dataHolder.get();  ExecNode currentNode = new ExecNode(logName, System.currentTimeMillis(), elapseTimeMsToLog);  if (execData == null) {  execData = new ExecData();  execData.root = currentNode;  dataHolder.set(execData);  } else {  ExecNode parent = execData.currentNode;  currentNode.setParent(parent);  parent.getChildList().add(currentNode);  }  execData.currentNode = currentNode;  execData.level++;
}  

这样,我们就把方法的层级关系记录下来了,在执行完被监控的方法之后,我们使用stop的方法来记录执行结束时间,并对符合条件的方法进行日志的输出。就这么几十行代码,我们非常简单的把这个监控写完了,部署到我们自己的应用中来监控方法的性能,从此,我们不用再去猜到底是哪个方法执行太慢了,到底是哪一步慢了。性能,监控,尽在掌握中。

转载于:https://www.cnblogs.com/zhoukedou/archive/2013/04/12/3017005.html

spring AOP的方式监控方法的执行时间相关推荐

  1. 在 Spring Boot 中使用 Spring AOP 和 AspectJ 来测量方法的执行时间

    原文链接:https://dzone.com/articles/logging-average-method-execution-times-via-aspectj 作者:Murat Derman 译 ...

  2. Spring AOP实例——异常处理和记录程序执行时间

    Spring AOP实例--异常处理和记录程序执行时间 参考文章: (1)Spring AOP实例--异常处理和记录程序执行时间 (2)https://www.cnblogs.com/victoria ...

  3. Spring AOP注解方式实现

    简介 上文已经提到了Spring AOP的概念以及简单的静态代理.动态代理简单示例,链接地址:https://www.cnblogs.com/chenzhaoren/p/9959596.html 本文 ...

  4. spring aop示例_Spring查找方法示例

    spring aop示例 当一个bean依赖于另一个bean时,我们使用setter属性或通过构造函数注入bean. getter方法将向我们返回已设置的引用,但是假设您每次调用getter方法时都想 ...

  5. Spring AOP无法拦截内部方法调用-- expose-proxy=true用法

    假设一个接口里面有两个方法: package demo.long;public interface CustomerService { public void doSomething1(); publ ...

  6. spring aop获取目标对象的方法对象(包括方法上的注解)(转)

    这两天在学习权限控制模块.以前看过传智播客黎活明老师的巴巴运动网视频教程,里面就讲到权限控制的解决方案,当时也只是看看视频,没有动手实践,虽说看过几遍,可是对于系统中的权限控制还是很迷茫,所以借着这次 ...

  7. Spring AOP注解方式实现日志管理

    文章目录 自定义注解 BussLog BussLogAspect 前言:使用注解方式实现日志管理,可以使我们的程序变的清晰.简单,不和很多业务代码混在一起. 实现思路大致分为四点 设计日志表和日志类, ...

  8. 哪些方法不能够实施Spring AOP事务

    2019独角兽企业重金招聘Python工程师标准>>> 哪些方法不能够实施Spring AOP事务 由于Spring事务管理是基于接口代理或动态字节码技术.通过AOP实施事务增强. ...

  9. spring AOP对父类方法加强分析

    spring AOP可以对方法进行加强,就是在方法前执行一些想要的事情,执行方法后想执行一些信息,原理就是利用动态代理,具体不在阐述 今天要讨论的是一个springBean继承了父类,在父类里进行了方 ...

  10. spring aop不执行_使用Spring AOP重试方法执行

    spring aop不执行 我的一位博客关注者发送了一封电子邮件,要求我显示" Spring AOP的RealWorld用法"示例. 他提到,在大多数示例中,都演示了Spring ...

最新文章

  1. 【阿里云课程】图神经网络基础:图的应用、表示与图卷积
  2. mysql8.0默认引擎是什么_MySQL8.0新特性【转】
  3. 接口,抽象类与内部类
  4. VC控制台输出时设置字体及背景颜色
  5. [蓝桥杯2016初赛]煤球数目-找规律
  6. python假设税前工资和税率如下_Python来做假设检验
  7. html选择按钮select,Html选择使用select来改变一个按钮的链接使用Javascript
  8. DIV+CSS 之 网页切图过程中div+css命名规则
  9. 0c-38-ARC快速入门
  10. intval0.57100 php_关于PHP浮点数之 intval((0.1+0.7)*10) 为什么是7
  11. db2 查看属性的数据类型 小数位 null约束
  12. gg修改器修改数值没有用怎么办_风灵月影是谁?风灵月影修改器大全
  13. _如何在 Linux 上安装 Minecraft 服务器
  14. CSU - 1803 数论GCD
  15. Win11 在线安装QT5.15.2教程
  16. idea创建svn分支
  17. 尚硅谷Vue2.0+Vue3.0全套教程视频笔记 + 代码 [P101-135]
  18. 断背山 - 剧情花絮 - 电影 - 风行
  19. vue3 vite版本 引入本地静态图片的方式
  20. 计算机类期刊投稿心得

热门文章

  1. MESSL(maven + extjs + spring portlet mvc + spring web flow + liferay )整合架构 7
  2. INADDR_ANY的确切含义
  3. 浅谈ANR及如何分析解决ANR
  4. Citrix XenDesktop VS Vmware View (上)-你必须懂得
  5. Gmail priority inbox帮助你减少工作量
  6. 《An Attentive Survey of Attention Models》阅读笔记
  7. jquery插件实现分页
  8. groovy-实现接口
  9. VirtualBox开发环境的搭建详解
  10. MySQL优化步骤和my.cnf优化配置