难道阿卡从源头演员复制MDC到其他演员和期货?(Does akka copy MDC from so

2019-10-23 15:57发布

正如我在阿卡规范读它支持MDC的演员。 例如,我可以把新闻中心信息来源的MDC,然后在演员使用它。 但对于期货 ? 难道阿卡提供任何担保因为这是在演员发起的未来将具有相同的MDC? 另外关于发送给其他参与者的消息是什么 - 是MDC被默认复制?

注意

对我来说,它看起来很奇怪,我可以使用MDC只有内的一个演员代码。

Answer 1:

他们可以,但他们实际上没有。 当你调用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(...)



文章来源: Does akka copy MDC from source actor to other actors and futures?