0

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私のテストに基づいて、常に同じスレッドで実行されます。

4

1 に答える 1