正如我在阿卡规范读它支持MDC的演员。 例如,我可以把新闻中心信息来源的MDC,然后在演员使用它。 但对于期货 ? 难道阿卡提供任何担保因为这是在演员发起的未来将具有相同的MDC? 另外关于发送给其他参与者的消息是什么 - 是MDC被默认复制?
注意
对我来说,它看起来很奇怪,我可以使用MDC只有内的一个演员代码。
正如我在阿卡规范读它支持MDC的演员。 例如,我可以把新闻中心信息来源的MDC,然后在演员使用它。 但对于期货 ? 难道阿卡提供任何担保因为这是在演员发起的未来将具有相同的MDC? 另外关于发送给其他参与者的消息是什么 - 是MDC被默认复制?
注意
对我来说,它看起来很奇怪,我可以使用MDC只有内的一个演员代码。
他们可以,但他们实际上没有。 当你调用LoggingAdapter的成员,你实际调用演员的成员:
package akka.event
trait LoggingAdapter {// and it's implementations DagnosticLoggingAdapter, BusLoggingAdapter
type MDC = Logging.MDC
def mdc = Logging.emptyMDC
def notifyError(message: String): Unit = bus.publish(Error(logSource, logClass, message, mdc))
...
}
所以你在这里访问演员的成员。 该构件被设置前处理请求每次:
package akka.actor
trait DiagnosticActorLogging extends Actor {
...
override protected[akka] def aroundReceive(receive: Actor.Receive, msg: Any): Unit = try {
log.mdc(mdc(msg))
super.aroundReceive(receive, msg)
} finally {
log.clearMDC()
}
}
所以,如果你从未来访问它(这可能会同时与其他一些消息中运行的另一个线程) - 有没有保证,你拿起MDC为您的消息。 同样的问题,作为接收器,但更深刻的,因为你不能获得额外的MDC信息简单的方法。
PS阿卡可能是更聪明,获得MDC信息,隐含的,所以你可以捕捉它作为一个封闭,类似的东西:
implicit val metaMdc = getMetaMdc
Future {
log.warning(...)
}
这里的问题是,阿卡会在每次登录时该metaMdc附加到当前线程的MDC(或者你必须初始化它的一些方式)作为SLF4J的MDC是本地线程 ,因此它的每一个线程不同。 所以,阿卡不知道与准确物理MDC你会执行你log.warning(...)