如何使用MDC with playframework for java

问题描述:

  1. 由于函数在托管线程池中执行,MDC并不总是在playframework中工作。
  2. 在这种情况下,建议在向执行程序提交任务之前,在原始(主)线程上调用MDC.getCopyOfContextMap()。
  3. 但是线程池由playframework管理,我不能在原始线程上调用mDC.getCopyOfContextMap()。
  4. 是否有一些解决方案的Java?或者我可以为MDC添加一个方面,因为我可以从上下文手动获取需要的数据,以及如何操作?谢谢
+0

在我们的项目中,我们使用上下文来传递traceId。我发现了两个解决方案来解决这个问题。 1.自定义HttpContextExecution 2.自定义记录器 -------------------------------------- --- 1.编写一个类来实现scala.concurrent.ExecutionContextExecutor并模仿play.core.j.HttpExecutionContext的方法。 2.只需包装记录器,并将从上下文获得的数据放入MDC –

这里有一个针对Playframework的open bug。该错误报告仅涉及Scala,但同样的问题也影响到Java,因为它是由MDC成为线程本地引起的,但在Play中,单个请求可以分解为几个子调用,每个子调用可以在不同的线程上运行, MDC不会传播到所有这些线程。

这里有提出一些解决方案:

或者,你要么需要等到the bug是固定的或接受MDC不会表现你期望的方式至。