我有一个 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);
}
}
}
以及实际的actor实现:
public class SomeActor extends BaseActor {
SomeActor() {
receive(ReceiveBuilder
.match(SomeMessage.class, message -> {
...
}
}
}
我想确保里面的所有日志条目SomeActor#receive()
都将在BaseActor
. 为了使这项工作SomeActor#receice()
需要在与BaseActor#aroundReceive()
方法相同的线程中执行。
我没有找到有关行为的任何信息aroundReceive
- 是否总是在与实际receive
方法相同的线程中执行?根据我的测试,它总是在同一个线程中执行。