gpt4 book ai didi

java - 使用 AspectJ 监控 Spring Boot 应用程序中 REST 调用的运行时间

转载 作者:行者123 更新时间:2023-12-01 08:51:24 25 4
gpt4 key购买 nike

我有一个 Spring Boot 应用程序,其中包含多个类,这些类共享一个发出 Http 请求的通用 HttpUtil 类。过去,我曾在以下场合使用过 AspectJ:

@Around("execution(* com.gateway.TestGateway.getStatus(..))")
public Object GatewayStatus(ProceedingJoinPoint pjp) throws Throwable {
StopWatch watch = new StopWatch();
watch.start();
Object output = pjp.proceed();
watch.stop();
log.error("Call took - [" + (watch.getTime()) + "]ms");
return output;
}

这工作正常,我将 getStatus() 方法与 @Around 注释相匹配,但是网关结构现在具有围绕 httputil 调用的代码,并且我只想分析其余的调用。新的网关方法如下所示:

final HttpUtil httpUtil; //Constructor injected by Spring.

public ResponseEntity<String> getResponse(final String serviceUrl, final HttpEntity<String> httpEntity) throws Exception {

ResponseEntity<String> response = null;
//Code here to verify the Entity
try{
response = httpUtil.postEntity(serviceUrl, httpEntity, String.class,
httpUtil.getRestTemplate());
//Logic here to work on the response.
}
catch(Exception e){
log.error("Error occurred");
}
return response;
}

我意识到我可以重构它,或者在 HttpUtil 类方法本身上使用探查器,但是如何使用 AspectJ 来匹配现有方法中的代码片段?例如,在 postEntity() 调用开始时以及 postEntity() 调用完成之后在方法返回之前运行。

我对切入点和其他 AspectJ 属性不太熟悉。我想做的只是记录执行时间,但我想了解有关 AspectJ 的更多信息。

最佳答案

当您在程序中选择要应用建议并执行一些额外代码(例如对 postEntity() 方法调用进行计时)的点时,您必须创建连接点切入点为您选择的位置。切入点定义了您的建议将应用的连接点(计时代码将开始的位置)。

所以,我认为您的问题具体是关于如何在 ClassThatHasGetResponse 类中调用 postEntity() 时定义切入点。

记录了描述切入点的不同方法 here一些不错的切入点示例是 here .

对于你的问题,你可能有这样的切入点:

cflow(execution(Object ClassThatHasGetResponse.com.package.getResponse(..))) && call(* HttpUtil.postEntity(..))

上面的切入点定义了执行控制流位于类 ClassThatHasGetResponse 的方法 getResponse() 内的位置,并且对 进行了方法调用postEntity() 具有任何返回类型和任何参数。

您必须将此切入点添加到捕获计时数据的 @Around 建议中,可能如下所示:

@Around("cflow(execution(Object ClassThatHasGetResponse.com.package.getResponse(..))) && call(* HttpUtil.postEntity(..))")
public Object GatewayStatus(ProceedingJoinPoint pjp) throws Throwable {
StopWatch watch = new StopWatch();
watch.start();
Object output = pjp.proceed();
watch.stop();
log.error("Call took - [" + (watch.getTime()) + "]ms");
return output;
}

由于您使用的是 Spring,因此还值得注意的是 Spring 对 AOP 的支持(这与 AspectJ 不同,但在 IMO 中很容易对使用其中一个与另一个感到困惑,尤其是当第一次通过Spring学习AOP,同时使用AspectJ),切入点(由连接点组成)始终是方法执行点,这从AspectJ的灵 active 上简化了一点。 Source

关于java - 使用 AspectJ 监控 Spring Boot 应用程序中 REST 调用的运行时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42380875/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com