APM 拦截器Scope的应用

APM 专栏收录该内容
18 篇文章 0 订阅

这里写代码片使用拦截器Scope以避免重复跟踪

这种情况比较普遍,例如有方法A和方法B,方法A中调用方法B,这两个方法又都可以被独立调用。即可能产生的调用路径有:

外部->A->B
外部->B

如果对A和B都注入拦截器,那么在上述嵌套调用时,会产生重复跟踪的情况。
这时一来拦截器不容易编码,可能需要考虑嵌套跟踪的干扰,二来重复跟踪是不必要的。

为了避免这种情况,可以使用Scope拦截器。

使用InterceptorScope来指定一个Scope,使用ExecutionPolicy来指定一种策略。

ExecutionPolicy有3种策略:

ALWAYS: 始终执行
BOUNDARY: 一个Scope下,只能有一个拦截器在执行
INTERNAL: 必须在另一个相同Scope的拦截器在执行时,才执行

其中,默认的策略是BOUNDARY,即不能嵌套拦截。

使用拦截器Scope以共享数据

例如有方法A和方法B,方法A中调用方法B。

如果需要拦截方法A和方法B,并且需要在拦截这2个方法的过程中传递/共享一些数据,那么就需要使用Scope来传递这些数据。

在这个例子里,A和B的拦截器都设置同一个Scope,并且设置B的ExecutionPolicy为INTERNAL,A的拦截器中产生共享数据,并且在B的拦截器中使用共享数据。
共享数据的传递交给Scope完成。

使用拦截器Scope拦截构造方法

构造方法拦截器也可以设置Scope,但是请注意,设置构造方法拦截器的Scope和设置普通方法拦截器Scope的概念和影响是不同的。

这是因为java对于构造方法嵌套的限制造成的。
对于普通方法来说,如果方法A调用方法B,那么这2个方法的拦截器A’和B’中方法的执行顺序是这样的:

A’.before()->B’.before()->B’.after()->A’.after()
而对于构造方法来说,如果类B继承类A,那么这2个类的构造方法的拦截器A’和B’中方法的执行顺序是这样的:

A’.before()->A’.after()->B’.before()->B’.after()
所以,如果要设置构造方法的拦截器Scope,那么要注意,即使设置了策略为BOUNDARY,也不会使上例中的B’中的方法不执行,因为在B’执行时,A’已经执行结束了。

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值