Java Akka アプリケーションがあり、メッセージ内の情報に基づいてメッセージ処理ごとに個別の 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()
内部のすべてのログ エントリの MDC コンテキストが に設定されていることを確認したいと思いますBaseActor
。これを機能させるには、メソッドSomeActor#receice()
と同じスレッドで実行する必要があります。BaseActor#aroundReceive()
の動作に関する情報は見つかりませんでした-それは常に実際のメソッドaroundReceive
と同じスレッドで実行されますか? receive
私のテストに基づいて、常に同じスレッドで実行されます。