[随笔] 项目性能追踪 之 structs & spring 的拦截器
2016-05-11 18:00
525 查看
拦截器,顾名思义,对一些方法和操作做一些拦截,从而能够知道这些操作的一些执行情况。
Struts 的拦截器:
在struts 的配置文件中,添加 interceptor 如:
增加拦截类:
这样就可以知道 某个action 用了多长时间,参数是什么这类的。
那如果我想知道哪个方法用了多长时间呢?
使用spring 的拦截器即可。其实使用了spring 的拦截器,就不需要使用structs 的interceptor了。
java 代码:
一个简单的spring拦截器就出现了,能够拦截所有service 中定义的方法以及dao 中定义的方法。配置一下,同样可以拦截action。
这种方法,用来追踪方法耗时,还是比较适用的。
Struts 的拦截器:
在struts 的配置文件中,添加 interceptor 如:
<interceptors> <!-- 其它interceptor --> <interceptor name="XXMethodInterceptor" class="com.xx.web.util.xxMethodInterceptor" /> <interceptor-stack name="YYY"> <!-- 其它interceptor -ref --> <interceptor-ref name="xxMethodInterceptor"/> </interceptor-stack> </interceptors>
增加拦截类:
public class XXMethodInterceptor extends MethodFilterInterceptor{ @Override protected String doIntercept(ActionInvocation invocation) throws Exception { long startTime = System.currentTimeMillis(); String result = invocation.invoke(); String claz = getClaz(invocation.getAction().getClass().toString()); String actionName = invocation.getInvocationContext().getName(); long endTime = System.currentTimeMillis(); // 方法耗时 long executionTime = endTime - startTime; logger.info("统计:Class={}, Action={},耗时={}ms, 参数={}.", claz, actionName, executionTime, sb.toString()); return result; } } }
这样就可以知道 某个action 用了多长时间,参数是什么这类的。
那如果我想知道哪个方法用了多长时间呢?
使用spring 的拦截器即可。其实使用了spring 的拦截器,就不需要使用structs 的interceptor了。
xmlns:aop="http://www.springframework.org/schema/aop" http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd <!-- 日志记录某个类中方法花费时间aop --> <aop:config> <aop:advisor id="methodTimeLog" advice-ref="performanceInterceptor" pointcut="execution(* com.xx.service..*.*(..)) || execution(* com.xx.dao..*.*(..)) "/> </aop:config> <bean id="performanceInterceptor" class="com.xx.web.util.PerformanceInterceptor"/>
java 代码:
public class PerformanceInterceptor implements MethodInterceptor { private static final Logger logger = LoggerFactory.getLogger(PerformanceInterceptor.class); public Object invoke(MethodInvocation method) throws Throwable { long startTime = System.currentTimeMillis(); try { Object result = method.proceed(); return result; } finally { long endTime = System.currentTimeMillis(); // 方法耗时 long executionTime = endTime - startTime; // 方法名称 String methodName = method.getMethod().getName(); logger.info("Method Name: {}, Execution Time: {} ms.", methodName, executionTime); } } }
一个简单的spring拦截器就出现了,能够拦截所有service 中定义的方法以及dao 中定义的方法。配置一下,同样可以拦截action。
这种方法,用来追踪方法耗时,还是比较适用的。
相关文章推荐
- 如何修改eclipse中@author的默认选项
- Quartz Java resuming a job excecutes it many times--转
- SpringMVC4直接返回String乱码
- Myeclipse打不开,弹出对话框The Myeclipse executable launcher was unable to locate its companion shared library ”
- java中的匿名内部类总结
- myeclipse新建一个工作空间要做的事
- Java cookie的使用
- eclipse 3.7 没有jadClipse选项
- Spring Aop实例之xml配置
- spring 的优点?什么是DI机制? 什么是AOP?
- java中spring+springMVC+Mybatis主流框架maven的pom.xml配置参考
- 实例解析Java程序中正则表达式的贪婪模式匹配
- java 获取程序执行时间
- selenium java等待alert对话框弹出,并关闭对话框
- java枚举类型enum的使用
- struts2的result中传递多个参数
- java 匿名内部类
- decimalFormat("#","##0.00") java
- Spring基础知识(4)
- Java内存区域与内存溢出异常