zoukankan      html  css  js  c++  java
  • java自定义注解 方法运行时间

    使用场景
    面向切面,记录service方法运行时间。

    定义注解类 TimeMonitor

    import java.lang.annotation.Retention;
    import java.lang.annotation.Target;
    import java.lang.annotation.ElementType;
    import java.lang.annotation.RetentionPolicy;
    
    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface TimeMonitor {
    
    }
    

    创建切面配置类 MonitorAspect

    @Aspect:作用是把当前类标识为一个切面供容器读取

    @Pointcut:Pointcut是植入Advice的触发条件。每个Pointcut的定义包括2部分,一是表达式,二是方法签名。方法签名必须是 public及void型。可以将Pointcut中的方法看作是一个被Advice引用的助记符,因为表达式不直观,因此我们可以通过方法签名的方式为 此表达式命名。因此Pointcut中的方法只需要方法签名,而不需要在方法体内编写实际代码。
    @Around:环绕增强,相当于MethodInterceptor
    @AfterReturning:后置增强,相当于AfterReturningAdvice,方法正常退出时执行
    @Before:标识一个前置增强方法,相当于BeforeAdvice的功能,相似功能的还有
    @AfterThrowing:异常抛出增强,相当于ThrowsAdvice
    @After: final增强,不管是抛出异常或者正常退出都会执行

    import java.util.Arrays;
    
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.Around;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Pointcut;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Component;
    
    @Aspect
    @Component
    public class MonitorAspect {
        private static final Logger logger = LoggerFactory.getLogger(MonitorAspect.class);
    
        // 修正Timer注解的全局唯一限定符
        @Pointcut("@annotation(com.kxb.microservice.inter.TimeMonitor)")
        private void pointcut() {
        }
    
        @Around("pointcut()")
        public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
            // 获取目标Logger
    
            // 获取目标类名称
            String clazzName = joinPoint.getTarget().getClass().getName();
    
            // 获取目标类方法名称
            String methodName = joinPoint.getSignature().getName();
    
            long start = System.currentTimeMillis();
            logger.error("{}: {}: start...", clazzName, methodName);
    
            String targetMethodParams = Arrays.toString(joinPoint.getArgs());
            // 调用目标方法
            Object result = joinPoint.proceed();
    
            long time = System.currentTimeMillis() - start;
            logger.error("{}: {}: {}: end... cost time: {} ms", clazzName, methodName, targetMethodParams, time);
    
            return result;
        }
    }
    

    在service类的方法上加上注解@TimeMonitor
    执行此方法之后打印出运行时间

    public class ConsumerService {
        @TimeMonitor
        public Map<String, Object> execute(String text) {
    
            Map<String, Object> dealResult = null;
            String uuid = PubFun.getUUID(); // 标记整条流程数据
            try {
                logger.info("分发器接收入口ActiveMq 接受队列信息text:{}...uuid:{}", text, uuid);
                ObjectMapper mapper = new ObjectMapper();
                Map<String, Object> param = mapper.readValue(text, HashMap.class);
    
                param.put(Constant.MSG_TEXT, text);
                // 执行代码
            } catch (Exception e) {
                logger.error("异常:{}", e);
            }
            return dealResult;
        }
    }
    

    运行日志如下:

  • 相关阅读:
    SQL Server 深入解析索引存储(非聚集索引)
    class.forName的官方使用方法说明
    使用C++实现学生管理系统
    hdu5033 Building 单调队列
    leetCode 72.Edit Distance (编辑距离) 解题思路和方法
    IOS7 textkit 的相关
    nodejs即时聊天
    5种语言混合编程:C++、JS、python、Lisp、汇编
    java Semaphore信号亮-同意多个任务同一时候訪问这个资源--thinking in java21.7.6
    关于Android的.so文件所须要知道的
  • 原文地址:https://www.cnblogs.com/stubborn-dude/p/14417312.html
Copyright © 2011-2022 走看看