前言:
公司生产环境频频被报性能瓶颈问题,为了找出问题的所在,现有的很多种方式能够解决,但是为了能够观测到具体的方法,我们想通过拦截那种耗时的方法,然后插入数据库,后台支撑系统能够实时的观察...
?
为了上述描述的结果,我们采用spring拦截器的方式,通过stopwatch的观察者模式,通过方法进入和方法退出来计算方法调用整个耗时情况
?
package spring.lifecycle;
import net.bull.javamelody.MonitoringSpringInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.springframework.util.StopWatch;
/**
* Created by Young on 2015/9/26.
*/
class MonitoringSpringInterceptor2 extends MonitoringSpringInterceptor {
public Object invoke(MethodInvocation invocation) throws Throwable {
final String requestName = getRequestName(invocation);
StopWatch stopWatch = new StopWatch(requestName);
stopWatch.start(requestName);
try {
Object obj = super.invoke(invocation);
return obj;
} finally {
stopWatch.stop();
System.out.println(stopWatch.getTotalTimeSeconds());
}
}
}
?Spring的配置:
<bean id="monitoringSpringInterceptor" class="spring.lifecycle.MonitoringSpringInterceptor2"></bean> <bean id="autoProxyCreator" class="spring.lifecycle.BeanNameAutoProxyCreator"> <property name="beanNames"> <list> <value>*Service</value> <value>*DAO</value> </list> </property> <property name="interceptorFilter"> <map> <entry key="*Service" value="transactionInterceptor,monitoringSpringInterceptor"/> </map> </property>
?结论:
想起来这些拦截,实现很简单,但是应用场景很频繁,对于生产环境监测,其实有更多需要的场景,如:bug跟踪、性能检测、方法参数、方法return等,所以功能场景很多,代码也不难。
原文:http://cywhoyi.iteye.com/blog/2246402