HAP_接口監(jiān)控(注解)

image.png

方法一:注解:

新建注解接口:

package wht.ora20796.aop;

import java.lang.annotation.*;

/**
 * Service注解
 */
@Inherited
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ServiceAnnotation {
    String apiName() default "";
    String sysName() default "";
}

新建切面類監(jiān)聽注解接口:


image.png
image.png


package wht.ora20796.aop;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.hand.hap.intergration.annotation.HapInbound;
import com.hand.hap.intergration.annotation.HapOutbound;
import com.hand.hap.intergration.aop.HapInvokeAspect;
import com.hand.hap.intergration.beans.HapInvokeInfo;
import com.hand.hap.intergration.beans.HapinterfaceBound;
import com.hand.hap.intergration.dto.HapInterfaceInbound;
import com.hand.hap.intergration.dto.HapInterfaceOutbound;
import com.hand.hap.intergration.util.HapInvokeLogUtils;
import com.hand.hap.message.IMessagePublisher;
import com.hand.hap.system.dto.ResponseData;
import net.sf.json.JSONObject;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.util.Date;

/**
* 切面類
*/
@Component
@Aspect  // 指定當前類為切面類
public class VendorAop {
  private static final Logger logger = LoggerFactory.getLogger(HapInvokeAspect.class);
  @Autowired
  private IMessagePublisher messagePublisher;
  @Autowired
  private ObjectMapper objectMapper;
  private Class interfaceHeaderServiceClazz;
  private Class interfaceHeaderClazz;
  private Object interfaceHeaderServiceImpl;

  public VendorAop() {
  }

  public void contextInitialized(ApplicationContext applicationContext) {
      try {
          this.interfaceHeaderServiceClazz = Class.forName("com.hand.hap.intergration.service.IHapInterfaceHeaderService");
          if (this.interfaceHeaderServiceClazz != null) {
              this.interfaceHeaderClazz = Class.forName("com.hand.hap.intergration.dto.HapInterfaceHeader");
              this.interfaceHeaderServiceImpl = applicationContext.getParentBeanFactory().getBean("hapInterfaceHeaderServiceImpl", this.interfaceHeaderServiceClazz);
          }
      } catch (Exception var3) {
          logger.debug("interface module class not found");
      }

  }
//    @HapOutbound
//    HapInvokeAspect hapInvokeAspect;
  //指定切入點表單式:攔截哪些方法:即為哪些類生成代理對象
 //@Pointcut("execution(* wht.ora20796.service.ISoapVendorService.*(..))")
  @Pointcut("@annotation(wht.ora20796.aop.ServiceAnnotation)")
  public void pointCut_() {
  }
  @Around("@annotation(bound)")
  public Object aroundMethod(ProceedingJoinPoint pjd, ServiceAnnotation bound) throws Throwable {
      System.out.println("-------------------注解監(jiān)聽------------------");
      Long startTime = System.currentTimeMillis();
      Object result = null;
      Throwable throwable = null;
      HapInterfaceOutbound outbound = new HapInterfaceOutbound();
      HapInvokeInfo.OUTBOUND.set(outbound);
      boolean var18 = false;

      HapinterfaceBound hapinterfaceBound;
      label165: {
          try {
              var18 = true;
              outbound.setRequestTime(new Date());
              Object[] args = pjd.getArgs();
              String sysName = null;
              String apiName = null;
              Object[] var10 = args;
              int var11 = args.length;

              for(int var12 = 0; var12 < var11; ++var12) {
                  Object obj = var10[var12];
                  if (obj instanceof HttpServletRequest) {
                      sysName = ((HttpServletRequest)obj).getParameter("sysName");
                      apiName = ((HttpServletRequest)obj).getParameter("apiName");
                  }
              }

              if (sysName == null && apiName == null) {
                  sysName = bound.sysName();
                  apiName = bound.apiName();
              }

              outbound.setInterfaceName(sysName + "-" + apiName);
              if (this.interfaceHeaderServiceClazz != null && this.interfaceHeaderClazz != null && this.interfaceHeaderServiceImpl != null) {
                  Method getHeaderAndLineMethod = this.interfaceHeaderServiceClazz.getMethod("getHeaderAndLine", String.class, String.class);
                  Object hapInterfaceHeaderObject = getHeaderAndLineMethod.invoke(this.interfaceHeaderServiceImpl, sysName, apiName);
                  if (hapInterfaceHeaderObject != null) {
                      Method getDomainUrl = this.interfaceHeaderClazz.getMethod("getDomainUrl");
                      Method getIftUrl = this.interfaceHeaderClazz.getMethod("getIftUrl");
                      outbound.setInterfaceUrl(getDomainUrl.invoke(hapInterfaceHeaderObject).toString() + getIftUrl.invoke(hapInterfaceHeaderObject).toString());
                  } else {
                      outbound.setInterfaceUrl(" ");
                  }
              }

              result = pjd.proceed();
              if (HapInvokeInfo.OUTBOUND_REQUEST_PARAMETER.get() != null) {
                  outbound.setRequestParameter((String)HapInvokeInfo.OUTBOUND_REQUEST_PARAMETER.get());
              }

              if (HapInvokeInfo.HTTP_RESPONSE_CODE.get() != null) {
                  outbound.setResponseCode(((Integer)HapInvokeInfo.HTTP_RESPONSE_CODE.get()).toString());
              }

              if (HapInvokeInfo.OUTBOUND_RESPONSE_DATA.get() != null) {
                  outbound.setResponseContent((String)HapInvokeInfo.OUTBOUND_RESPONSE_DATA.get());
              } else if (result != null) {
                  outbound.setResponseContent(result.toString());
              }

              outbound.setRequestStatus("success");
              HapInterfaceInbound inbound = (HapInterfaceInbound)HapInvokeInfo.INBOUND.get();
              if (inbound != null) {
                  if (inbound.getStackTrace() != null) {
                      outbound.setStackTrace(inbound.getStackTrace());
                      outbound.setRequestStatus("failure");
                  }

                  HapInvokeInfo.INBOUND.remove();
                  var18 = false;
              } else {
                  var18 = false;
              }
              break label165;
          } catch (Throwable var19) {
              throwable = var19;
              result = new JSONObject();
              ((JSONObject)result).put("error", var19.getMessage());
              var18 = false;
          } finally {
              if (var18) {
                  outbound.setResponseTime(System.currentTimeMillis() - startTime);
                  HapInvokeLogUtils.processExceptionInfo(outbound, throwable);
                   hapinterfaceBound = new HapinterfaceBound(outbound);
                  this.messagePublisher.message("invoke.service", hapinterfaceBound);
                  HapInvokeInfo.clearOutboundInfo();
              }
          }

          outbound.setResponseTime(System.currentTimeMillis() - startTime);
          HapInvokeLogUtils.processExceptionInfo(outbound, throwable);
          hapinterfaceBound = new HapinterfaceBound(outbound);
          this.messagePublisher.message("invoke.service", hapinterfaceBound);
          HapInvokeInfo.clearOutboundInfo();
          return result;
      }

      outbound.setResponseTime(System.currentTimeMillis() - startTime);
      HapInvokeLogUtils.processExceptionInfo(outbound, throwable);
      hapinterfaceBound = new HapinterfaceBound(outbound);
      this.messagePublisher.message("invoke.service", hapinterfaceBound);
      HapInvokeInfo.clearOutboundInfo();
      return result;
  }

  // 環(huán)繞通知:環(huán)繞目標方式執(zhí)行
  /*@Around("@annotation(bound)")
  public void around(ProceedingJoinPoint pjp,ServiceAnnotation bound) throws Throwable {
      System.out.println("環(huán)繞前....");
      pjp.proceed();  // 執(zhí)行目標方法
      System.out.println("環(huán)繞后....");
  }*/

  // 前置通知 : 在執(zhí)行目標方法之前執(zhí)行
/*  @Before("pointCut_()")
  public void begin() {
      System.out.println("-----------ISoapVendorService---------");
      System.out.println("開始事務/異常");

  }

  // 后置/最終通知:在執(zhí)行目標方法之后執(zhí)行  【無論是否出現(xiàn)異常最終都會執(zhí)行】
  @After("pointCut_()")
  public void after() {
      System.out.println("-----------ISoapVendorService---------");
      System.out.println("提交事務/關閉");
  }*/
/*
  // 返回后通知: 在調用目標方法結束后執(zhí)行 【出現(xiàn)異常不執(zhí)行】
  @AfterReturning("pointCut_()")
  public void afterReturning() {
      System.out.println("afterReturning()");
  }

  // 異常通知: 當目標方法執(zhí)行異常時候執(zhí)行此關注點代碼
  @AfterThrowing("pointCut_()")
  public void afterThrowing() {
      System.out.println("afterThrowing()");
  }
*/



}

給方法添加新建的注解:


image.png

測試:


image.png
image.png

方法二:(非注解)對ISoapVendorService.java中的方法繼續(xù)切面增強

package wht.ora20796.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 * 切面類
 */
@Component
@Aspect  // 指定當前類為切面類
public class VendorAop {
    //指定切入點表單式:攔截哪些方法:即為哪些類生成代理對象
    @Pointcut("execution(* wht.ora20796.service.ISoapVendorService.*(..))")
    //@Pointcut("execution(* wht.ora20796.aop.UserDaoImpl.save(..))")
    public void pointCut_() {
    }

    // 前置通知 : 在執(zhí)行目標方法之前執(zhí)行
    @Before("pointCut_()")
    public void begin() {
        System.out.println("-----------ISoapVendorService---------");
        System.out.println("開始事務/異常");

    }

    /*// 后置/最終通知:在執(zhí)行目標方法之后執(zhí)行  【無論是否出現(xiàn)異常最終都會執(zhí)行】
    @After("pointCut_()")
    public void after() {
        System.out.println("提交事務/關閉");
    }

    // 返回后通知: 在調用目標方法結束后執(zhí)行 【出現(xiàn)異常不執(zhí)行】
    @AfterReturning("pointCut_()")
    public void afterReturning() {
        System.out.println("afterReturning()");
    }

    // 異常通知: 當目標方法執(zhí)行異常時候執(zhí)行此關注點代碼
    @AfterThrowing("pointCut_()")
    public void afterThrowing() {
        System.out.println("afterThrowing()");
    }

    // 環(huán)繞通知:環(huán)繞目標方式執(zhí)行
    @Around("pointCut_()")
    public void around(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("環(huán)繞前....");
        pjp.proceed();  // 執(zhí)行目標方法
        System.out.println("環(huán)繞后....");
    }*/


}

效果:


image.png
image.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子焕妙,更是在濱河造成了極大的恐慌谜酒,老刑警劉巖洲鸠,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件玫恳,死亡現(xiàn)場離奇詭異逊移,居然都是意外死亡逻翁,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門氧急,熙熙樓的掌柜王于貴愁眉苦臉地迎上來颗胡,“玉大人,你說我怎么就攤上這事吩坝《疽蹋” “怎么了?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵钉寝,是天一觀的道長弧呐。 經常有香客問我闸迷,道長,這世上最難降的妖魔是什么俘枫? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任腥沽,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己壁酬,他們只是感情好,可當我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布酣栈。 她就那樣靜靜地躺著,像睡著了一般汹押。 火紅的嫁衣襯著肌膚如雪矿筝。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天棚贾,我揣著相機與錄音窖维,去河邊找鬼。 笑死妙痹,一個胖子當著我的面吹牛铸史,可吹牛的內容都是我干的。 我是一名探鬼主播怯伊,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼琳轿,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了耿芹?” 一聲冷哼從身側響起崭篡,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎吧秕,沒想到半個月后琉闪,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡砸彬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年颠毙,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片砂碉。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡蛀蜜,死狀恐怖,靈堂內的尸體忽然破棺而出绽淘,到底是詐尸還是另有隱情,我是刑警寧澤闹伪,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布沪铭,位于F島的核電站壮池,受9級特大地震影響,放射性物質發(fā)生泄漏杀怠。R本人自食惡果不足惜椰憋,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望赔退。 院中可真熱鬧橙依,春花似錦、人聲如沸硕旗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽漆枚。三九已至创译,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間墙基,已是汗流浹背软族。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留残制,地道東北人立砸。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像初茶,于是被迫代替她去往敵國和親颗祝。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內容

  • 一> 代理模式 概述 代理(Proxy)是一種設計模式纺蛆, 提供了對目標對象另外的訪問方式吐葵;即通過代理訪問目標對象。...
    奮斗的老王閱讀 1,123評論 0 50
  • 上一篇:Spring學習筆記(七、Spring AOP API) 一字支、AspectJ介紹與Pointcut注解應用...
    魯克巴克詩閱讀 3,906評論 0 4
  • 1. Java基礎部分 基礎部分的順序:基本語法凤藏,類相關的語法,內部類的語法堕伪,繼承相關的語法揖庄,異常的語法,線程的語...
    子非魚_t_閱讀 31,664評論 18 399
  • (一)酒鬼娶了傻子 我叫傻妞欠雌,不是因為我傻蹄梢,而是因為我是一個傻子撿來的孩子。 我爹富俄,確切的說應該是我的養(yǎng)父禁炒,是村里...
    渡心樹洞閱讀 167評論 0 2
  • 看完狼圖騰之后而咆,心中不由得感覺一陣惋惜,尤其是當陳陣和那頭狼離別時幕袱,狼還是沒有忘記看他最后一眼暴备,但心中向往的自由早...
    TommyFan閱讀 581評論 0 0