大众点评Cat接入(一) 注解接入

注解定义

注解定义为CatAnnotation,代码以下:java

import static java.lang.annotation.RetentionPolicy.RUNTIME;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

@Retention(RUNTIME)
@Target(ElementType.METHOD)
public @interface CatAnnotation {
}

切面使用注解

切面使用注解,类CatAop,代码以下:code

import java.lang.reflect.Method;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;

import com.dianping.cat.Cat;
import com.dianping.cat.message.Transaction;
import com.niwodai.inf.cat.dubbo.DubboCat;

@Aspect
public class CatAop {

	@Around(value = "execution(* com.niwodai..*.*(..))")
	public Object aroundMethod(ProceedingJoinPoint pjp) {
	    Object o = null;
	    //开关未打开,则直接跳过
	    if(!DubboCat.isAOPEnable()){
	        try{
	            o = pjp.proceed();
	        }catch(Throwable e){
	            
	        }
	        return o;
	    }
	    
		MethodSignature joinPointObject = (MethodSignature) pjp.getSignature();
		Method method = joinPointObject.getMethod();
		boolean flag = method.isAnnotationPresent(CatAnnotation.class);
		if (flag) {
			Transaction t = Cat.newTransaction("method", method.getName());
			
			try {
			    //继续执行方法
				o = pjp.proceed();

				t.setStatus(Transaction.SUCCESS);
				t.complete();
			} catch (Throwable e) {
				t.setStatus(e);
				Cat.logError(e);
			} finally {
				t.complete();
			}
		} else {
			try {
				o = pjp.proceed();
			} catch (Throwable e) {
			    
			}
		}
		return o;
	}

}

基本思路: 先判断aop监控是否打开,若是没有打开,直接发起调用;若是打开了,则在调用先后封装Cat监控。这里须要注意点aop路径,结合本身项目更改aop监控路径。get

相关文章
相关标签/搜索