【发布时间】:2016-05-31 22:54:11
【问题描述】:
我有一个 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 中设置MDC 上下文。要使这项工作SomeActor#receice() 需要在与BaseActor#aroundReceive() 方法相同的线程中执行。
我没有找到任何关于aroundReceive 行为的信息——它是否总是与实际的receive 方法在同一个线程中执行?根据我的测试,它总是在同一个线程中执行。
【问题讨论】: