Java Akkaアプリケーションがあり、メッセージ内の情報に基づいて各メッセージ処理用に別々のMDCコンテキストを設定する必要があります。たとえば、すべてのメッセージに対して次の基本インターフェイスを使用します。aroundReceiveメソッドのMDCコンテキスト
public interface IdMessage {
String getId();
}
また、私はすべての俳優たちのために、以下の基本の俳優を持っている:
public class BaseActor extends AbstractActor {
private final DiagnosticLoggingAdapter log = Logging.apply(this);
@Override
public void aroundReceive(PartialFunction<Object, BoxedUnit> receive, Object msg) {
if (msg instanceof IdMessage) {
final Map<String, Object> originalMDC = log.getMDC();
log.setMDC(ImmutableMap.of("id", ((IdMessage) msg).getId()));
try {
super.aroundReceive(receive, msg);
} finally {
if (originalMDC != null) {
log.setMDC(originalMDC);
} else {
log.clearMDC();
}
}
} else {
super.aroundReceive(receive, msg);
}
}
}
そして、実際の俳優の実装:
public class SomeActor extends BaseActor {
SomeActor() {
receive(ReceiveBuilder
.match(SomeMessage.class, message -> {
...
}
}
}
SomeActor#receive()
内のすべてのログエントリに、BaseActor
にMDCコンテキストが設定されていることを確認したいと思います。この作業をSomeActor#receice()
にするには、BaseActor#aroundReceive()
メソッドと同じスレッドで実行する必要があります。
aroundReceive
の動作に関する情報が見つかりませんでした - これは実際にreceive
メソッドと同じスレッドで実行される予定ですか?私のテストに基づいて、常に同じスレッドで実行されます。
「DiagnosticLoggingAdapter」がトリックをしない理由は、[この回答](http://stackoverflow.com/a/31237679/843660)で説明されています。 'aroundReceive'をオーバーライドする場合、これは内部APIとしてマークされ、あなたのクラスをハックである' akka.actor'パッケージに入れる場合にのみ機能します。 [この回答](http://stackoverflow.com/a/26723452/843660)を参照してください。 Javaで何ができるかわからない – dskrvk