2017-10-18 5 views
0
  1. MDCは、マネージドスレッドプールで機能が実行されるため、常にplayframeworkで動作するとは限りません。
  2. そのような場合、MDC.getCopyOfContextMap()は、元の(マスター)スレッドで実行されてから、エグゼキュータにタスクをサブミットすることをお勧めします。
  3. しかし、スレッドプールはplayframeworkによって管理されているため、元のスレッドのMDC.getCopyOfContextMap()を呼び出すことはできません。
  4. Java用のソリューションはありますか?または私は手動でコンテキストから必要なデータを得ることができるMDCのためのアスペクトを追加できますか?ありがとう
+0

プロジェクトでは、contextを使用してtraceIdを渡します。そして私はこの問題を解決する2つの解決策を見つけました。 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は、あなたがそれを期待するように動作しないことに同意する必要があります、次のいずれか

ここで提案されているいくつかの解決策があります。に。

関連する問題