- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在过去,我们有 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.scala
和
Future.scala
联系在一起,因为我们仍然可以实现上述场景,这非常好,我们所有的日志语句都可以记录请求 ID,因此开发人员永远不必记住记录请求 ID,您可以跟踪单个客户的请求响应周期那个身份证
最佳答案
如果你遇到这个,只需戳这里的线程
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/
我的应用程序中有 3 种不同的方法。全部返回CompletableFuture .我想并行执行方法 1 和 2。完成方法 1 和 2 后,我想使用方法 1 和 2 返回值的参数触发方法 3。 代码示例
我正在尝试加快对多个 API 的调用。 在下面的代码中,getFilteredEvents是当前同步版本。我有这样的感觉 map(x -> x.getFilteredEvents(eventResea
Q1。我的理解是,如果 future 正常或异常完成,就会调用 completableFuture.handle 。但是超时情况又如何呢? 第二季度。在哪里检查 completableFuture 的
我不明白这里发生了什么 CompletableFuture/supplyAsync。 如果我从先前实例化的 CompletableFuture 对象调用 supplyAsync 方法,它永远不会完成:
我有一个返回 CompletableFuture 的异步方法。 private CompletableFuture asyncA(..) 我公开了一个必须返回 CompleteableFuture 的
我在项目中找到了这段代码: int threadCount = 10; CompletableFuture[] futures = new CompletableFuture[threadCount]
让我们举个例子:我们有四种方法: CompletableFututre loadAndApply(SomeObject someObject); CompletableFuture loadData(
我有一个可完成的 future (future1),它创建了 10 个可完成的 future (futureN)。只有当所有 futureN 都完成时,有没有办法将 future1 设置为完成? 最佳
我想编写一个返回 CompletableFuture 的异步方法. future 的唯一目的是跟踪方法何时完成,而不是其结果。返回CompletableFuture会更好吗?或 Completable
我正在对我的数据库进行多次异步调用。我将所有这些异步调用存储在 List> list 上.我想一起收集所有结果,所以我需要等待所有这些调用完成。 一种方法是创建一个 CompletableFuture
我正在尝试使用 CompletableFuture 链接一些文件处理程序,它应该返回 CompletableFuture : CompletableFuture allGen = loadFile1(
我有 2 个 CompletableFuture。 task2 只能在 task1 完成后启动。然后,我需要等待所有任务完成。在下面的代码中,程序在 task1 结束后结束。 task2 开始但未完成
我有 2 个 CompletableFuture。 task2 只能在 task1 完成后启动。然后,我需要等待所有任务完成。在下面的代码中,程序在 task1 结束后结束。 task2 开始但未完成
我很难弄清楚这一点,并且可以向那些比我更有经验和知识的人寻求帮助。 基本问题是我需要获取对象列表,然后对于返回的每个对象,获取一些详细信息,并将详细信息缝合到对象中。我希望在这方面保持高效;我需要首先
我目前正在使用 CompletableFuture supplyAsync() 方法将一些任务提交到公共(public)线程池。这是代码片段的样子: final List>> completableF
为什么是CompletableFuture.allOf声明为 CompletableFuture而不是返回结果集合或其他东西?我认为制作 CompletableFuture.anyOf 是个好主意返回
我没有看到处理具有异步结果的异常的明显方法。 例如,如果我想重试一个异步操作,我会期待这样的事情: CompletionStage cf = askPong("cause error").handle
比如我有这样的方法: public CompletableFuture getPage(int i) { ... } public CompletableFuture getDocument(
我正在调用一个返回 CompletableFuture 的服务。 输出结构如下。 Class Output { public String name; public Integer a
我正在尝试转换 List>至CompletableFuture> .当您有许多异步任务并且需要获取所有这些任务的结果时,这非常有用。 如果其中任何一个失败,那么最终的 future 将失败。这就是我的
我是一名优秀的程序员,十分优秀!