2012-11-19 10 views
9

長年のJava EE開発者として、私はMDC(マップド診断コンテキスト)アプローチを使用してリクエストに関するコンテキストデータを渡すことに対処しました。要求の存続期間中に発生する多くの潜在的なログイベントにわたる要求を追跡するための固有の要求トークン。Akkaでリクエストコンテキストデータを保存する方法

ThreadLocalに依存しているとすれば、非同期技術を使用する場合、このアプローチが激減することは明らかです。

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

この種のデータを、アクター間で送信されるメッセージの一部として明示的に渡すだけでよいのですか?それは汚いと感じるのですが、同時に、容易にスケールする能力と互換性があります。

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

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 
} 

未来がディスパッチャにタスクを送信するたびに、からスレッドセーフコンテキストオブジェクトをコピーします。

+4

俳優間のコミュニケーション(情報の受け渡し)使用可能な唯一の情報は、メッセージのタイプと内容です。異なるチャネルを使用して暗黙的に情報を渡すことはできません。 –

+0

@drewzilla、これまでにこの問題について進歩しましたか?また、ライフサイクル全体のリクエストコンテキストをスカラーで追跡することに興味があります – devshorts

+0

関連:https://stackoverflow.com/questions/30091356/mdc-mapped-diagnostic-context-logging-in-akka – dskrvk

答えて

1

は、私はあなたがこのコードで同じエグゼキュータ暗黙のパラメータとして、静的な文脈の中で宣言ThreadLocal -sを使用できると思います1つの糸を別の糸に入れる。したがって、カスタムディスパッチャが必要です - 任意の手段でThreadLocalを読んで、それをexecutor(ディスパッチャ)内のどこかに保存してから、最初に書き込むタスクを送信してください。ThreadLocal

関連する問題