刘一天@认真是一种态度 使劲的浪费,用力的后悔。 java监测方法运行时间/效率方法

利用了Spring AOP 技术,对想要统计的方法进行横切处理,方法执行前开始计时,方法执行后停止计时,得到计时方法就是该方法本次消耗时间。

步骤:

  • 首先编写自己的Interceptor类来实现MethodInterceptor类,来用于切入方法,运行计时代码
  • Spring AOP 的XML配置,配置需要监测的方法和切入方法(自定义的Interceptor)
package com.cplatform.tencent.task;

import java.util.HashMap;
import java.util.Map;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.apache.commons.lang.time.StopWatch;
/**
 * 方法运行时间测试
 * @author liuyt
 * @date   2014-11-16 下午3:39:08
 * bolgs   http://www.cnblogs.com/liuyitian/
 */
public class MethodTimeActive implements MethodInterceptor {
    /**
     * 自定义map集合,key:方法名,value:[0:运行次数,1:总时间]
     */
    public static Map<String,Long[]> methodTest = new HashMap<String, Long[]>();
    /**
     * 拦截要执行的方法
     */
    public Object invoke(MethodInvocation invocation) throws Throwable {
        // 创建一个计时器
        StopWatch watch = new StopWatch();
        // 计时器开始
        watch.start(); 
        // 执行方法
        Object object = invocation.proceed();
        // 计时器停止
        watch.stop();
        // 方法名称
        String methodName = invocation.getMethod().getName();
        // 获取计时器计时时间
        Long time = watch.getTime();
        if(methodTest.containsKey(methodName)) {
            Long[] x = methodTest.get(methodName);
            x[0]++;
            x[1] += time;
        }else{
            methodTest.put(methodName, new Long[] {1L,time});
        }
        return object;
    }
    
}

<!-- 日志记录某个类中方法花费时间aop -->  
    <aop:config>  
        <!-- Spring 2.0 可以用 AspectJ 的语法定义 Pointcut,这里自定义要拦截方法的包所在 -->  
        <aop:advisor id="methodTimeLog" advice-ref="methodTimeAdvice" pointcut="execution(* com.cplatform.tencent.sync..*.*(..))"/>  
        <aop:advisor id="methodTimeLog2" advice-ref="methodTimeAdvice" pointcut="execution(* com.cplatform.tencent.utils..*.*(..))"/>  
    </aop:config>  
    <bean id="methodTimeAdvice" class="com.cplatform.tencent.task.MethodTimeActive"/>   

 使用AOP面向切面技术时,XML配置里面千万别忽略了以下配置:

package test;

import java.util.Map;
import java.util.Set;
import org.junit.After;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.cplatform.tencent.sync.PersistenceTicketService;
import com.cplatform.tencent.task.MethodTimeActive;
import com.cplatform.tencent.utils.AppConfig;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:spring-configuration/*.xml"})
@ActiveProfiles("production")
public class CopyOfDBTest {
    
    @Autowired
    private AppConfig appConfig;    // 这是我项目里用到的  可忽略
    @Autowired
    private PersistenceTicketService persistenceTicketService;
    
    // 测试某个方法,这个方法内部调用了很多业务处理方法
    @Test
    public void testInsertOrUpdate() {
        persistenceTicketService.insertOrUpdate(appConfig.getTicketCityIds(), appConfig.getAgentId());
    }
    
    // 测试方法运行完毕后,取出定义的Map集合,取出数据
    @After
    public void testMethodActive() {
        Map<String, Long[]> map = MethodTimeActive.methodTest;
        Set<String> set = map.keySet();
        Long[] x = null;
        for(String s : set) {
            x = map.get(s);
            System.out.println(s+":"+x[0]+"次,"+x[1]+"毫秒");
        }
    }
}

上面用到的是Spring和junit对WEB方法进行测试,具体可以参照SpringJunit4 进行单元测试


console输出:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值