大衆點評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

相關文章
相關標籤/搜索