[随笔] 项目性能追踪 之 structs & spring 的拦截器

拦截器,顾名思义,对一些方法和操作做一些拦截,从而能够知道这些操作的一些执行情况。

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。

这种方法,用来追踪方法耗时,还是比较适用的。

 

你可能感兴趣的:([随笔] 项目性能追踪 之 structs & spring 的拦截器)