gpt4 book ai didi

java-8 - CompletableFuture 是否有对应的本地上下文?

转载 作者:行者123 更新时间:2023-12-04 12:46:22 26 4
gpt4 key购买 nike

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

然后 Scala 和函数式编程出现了,Future s 和他们一起来了 Local.scala (至少我知道 twitter Future 有这个类)。 Future.scala了解Local.scala并通过所有 map 传输上下文/flatMap等等等等功能,我仍然可以做Local.set("requestId", getNewRequestId());然后在它经过许多线程后进入下游,我仍然可以使用 Local.get(...) 访问它

太好了,我的问题是在 Java 中,我可以用新的 CompletableFuture 做同样的事情吗?某处有 LocalContext或某些对象(不确定名称),通过这种方式,我可以修改 Logback MDC 上下文以将其存储在该上下文中,而不是 ThreadLocal这样我就不会丢失请求 ID 和我在 thenApply 中的所有日志, thenAccept等等等等仍然可以很好地使用日志记录和-XrequestId Logback 配置中的标志。

编辑:

举个例子。如果你有一个请求进来并且你正在使用 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 和 Twitter Future Scala 中的 s 以及 Local.scala类(class)。 Local.scalaFuture.scala联系在一起,因为我们仍然可以实现上述场景,这非常好,我们所有的日志语句都可以记录请求 ID,因此开发人员永远不必记住记录请求 ID,您可以跟踪单个客户的请求响应周期那个身份证

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

最佳答案

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

实现类似 twitter Futures 的东西,它传输本地变量(很像 ThreadLocal,但传输状态)。

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

如果 Java Authors 能解决这个问题,那么 logback 中的 MDC 将适用于所有 3rd 方库。在那之前,除非您可以更改 3rd 方库,否则它将无法正常工作(怀疑您是否可以这样做)。

关于java-8 - CompletableFuture 是否有对应的本地上下文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37933713/

26 4 0