CompletableFuture是否具有相应的本地上下文?

问题描述 投票:6回答:1

在过去,我们有ThreadLocal程序来携带数据和请求路径,因为所有请求处理都是在该线程上完成的,而像Logback这样的东西与MDC.put("requestId", getNewRequestId());一起使用

然后Scala和函数式编程出现了,Futures出现了,随之而来的是Local.scala(至少我知道twitter Futures有这个类)。 Future.scala知道Local.scala并通过所有map / flatMap等转移上下文等功能,这样我仍然可以做Local.set("requestId", getNewRequestId());然后下游它经过多个线程后,我仍然可以使用Local.get(...)访问它

Soooo,我的问题是在Java中,我可以使用CompletableFuture或某个对象(不确定名称)使用新的LocalContext做同样的事情,这样,我可以修改Logback MDC上下文以将其存储在该上下文中而不是一个ThreadLocal,我不会丢失请求ID和所有我的日志穿过thenApplythenAccept等等仍然可以正常工作日志和Logback配置中的-XrequestId标志。

编辑:

举个例子。如果您有请求进入并且您正在使用Log4j或Logback,则在过滤器中,您将设置MDC.put("requestId", requestId),然后在您的应用程序中,您将记录许多日志语句行:

log.info("request came in for url="+url);
log.info("request is complete");

现在,在日志输出中它将显示:

INFO {time}: requestId425 request came in for url=/mypath
INFO {time}: requestId425 request is complete

这是使用ThreadLocal的技巧来实现这一目标。在Twitter上,我们在Scala中使用Scala和Twitter Futures以及Local.scala类。 Local.scalaFuture.scala捆绑在一起,因为我们可以实现上述场景仍然非常好,我们所有的日志语句都可以记录请求ID,因此开发人员永远不必记住记录请求ID,您可以跟踪单个客户请求具有该id的响应周期。

我在Java中没有看到这个:(这是非常不幸的,因为有很多用例。也许有些东西我看不到?

java-8 logback completable-future
1个回答
0
投票

如果你遇到这个,只需在这里戳一下http://mail.openjdk.java.net/pipermail/core-libs-dev/2017-May/047867.html

实现像Twitter Futures这样的东西来转移Locals(很像ThreadLocal但转移状态)。

请参阅此处的def respond()方法以及它如何调用Locals.save()和Locals.restort()https://github.com/simonratner/twitter-util/blob/master/util-core/src/main/scala/com/twitter/util/Future.scala

如果Java作者会解决这个问题,那么回溯中的MDC将适用于所有第三方库。在此之前,除非您可以更改第三方库(否则您可以这样做),否则它将无法运行。

© www.soinside.com 2019 - 2024. All rights reserved.