9

長年の Java EE 開発者として、私は MDC (Mapped Diagnostic Context) アプローチを使用して、リクエストに関連するコンテキスト データの受け渡しに対処してきました。そのリクエストの有効期間。

ThreadLocal に依存していることを考えると、非同期手法を使用すると、このアプローチが崩壊することは明らかです。

私はまだ Scala の学習の初期段階にあり、この質問により関連するのは Akka です。Akka と MDC の非互換性を確認するフォーラムへの投稿をたくさん読みましたが、何らかの方法で MDC アプローチを模倣するための一貫した戦略をまだ明らかにしていません。

アクター間で送信されるメッセージの一部として、この種のデータを明示的に渡すだけでよいのでしょうか? 汚い感じがしますが、同時に、楽にスケーリングできる機能と互換性があります。

メッセージを介して直接アクターにコンテキストを渡す方法はありますか? また、Play 2.0 Async ブロックを使用しているときに、この同じ課題に直面した人はいますか?

4

1 に答える 1

1

ThreadLocalこのコードのエグゼキューターの暗黙的なパラメーターと同じように、静的コンテキストで宣言された -sを使用できると思います。

implicit val executor = context.dispatcher
val f = Future[Boolean] {
  someTask()
} andThen { 
  case err if err.isLeft => log.error("Some error: " + err.left.get); false
  case ok if ok.isRight => log.info("Good work: " + ok.right.get); true
}

future がタスクをディスパッチャに送信するたびに、スレッド セーフなコンテキスト オブジェクトをあるスレッドから別のスレッドにコピーします。そのため、カスタム ディスパッチャが必要です。必ず readThreadLocalを実行し、エグゼキュータ (ディスパッチャ) 内のどこかに内部的に格納してから、最初に書き込むタスクを送信します。ThreadLocal

于 2012-11-25T00:02:57.193 に答える