2017-10-18 129 views
0
  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 –

回答

1

這裏有一個針對Playframework的open bug。該錯誤報告僅涉及Scala,但同樣的問題也影響到Java,因爲它是由MDC成爲線程本地引起的,但在Play中,單個請求可以分解爲幾個子調用,每個子調用可以在不同的線程上運行, MDC不會傳播到所有這些線程。

這裏有提出一些解決方案:

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