【发布时间】:2020-06-22 22:47:36
【问题描述】:
我有以下跟踪方法执行时间的方面:
public Object addMetricsToReactiveMonoTimedMethod(ProceedingJoinPoint pjp, ReactiveTimed reactiveTimed) throws Throwable {
StopWatch stopWatch = new StopWatch();
Mono<?> mono = (Mono<?>) pjp.proceed();
return mono
.doOnSubscribe(subscription -> stopWatch.start())
.doFinally(signalType -> {
stopWatch.stop();
logTimer(pjp, stopWatch, reactiveTimed.name(), signalType);
});
}
方法本身是这样的:
public Mono<String> sayHi() {
return Mono.just("hi")
.subscriberContext(context -> context.put("requestId", "requestId"));
}
如何在我的方面方法中从订阅者上下文中获取requestId 变量?我想在doFinally 中使用它来了解分析了哪个请求。
【问题讨论】:
-
这只是一个杀手级的短语,因此不是很有建设性。为什么 AspectJ 阻塞的事实会成为一个问题?它与截获的代码在同一个线程中运行,只是用一些额外的功能(横切关注点)装饰它。那是合法的。这取决于开发人员不要在她的方面做不必要的“昂贵”(和阻塞)的东西。如果某个方面使整个应用程序脱轨,这就是一个问题——不管有没有反应式编程。使用强大的工具而不是“用工具做傻瓜”需要练习、经验和关心,就像在这个行业中一样。
-
@ThomasAndolf 您从哪里得知 AOP 阻塞了?这不是真的。将 AOP 与 Reactor 一起使用没有任何问题。问题中的代码完全没有问题,您可以在resilience4j中找到其他示例:github.com/resilience4j/resilience4j/blob/… 请停止传播虚假信息...
-
@IvanLymar 您可以尝试用于跟踪的 spring-cloud-sleuth 库。它能够基于 Reactor 上下文填充 MDC 日志上下文。因此,您也许可以在日志中获取请求 ID,而无需手动将其放入。
标签: reactive-programming aspectj spring-webflux project-reactor