当前位置: 首页 > 知识库问答 >
问题:

akka是否将MDC从源参与者复制到其他参与者和未来?

麹耘豪
2023-03-14

正如我在akka规范中所读到的,它在actors中支持mdc。例如,我可以将unic信息放在mdc中,然后在actor中使用它。但是期货呢?akka是否提供了任何保证,即在actor中启动的未来将具有相同的mdc?另外,发送给其他参与者的消息呢?默认情况下是否复制了MDC?

注意事项

对我来说,这看起来很奇怪,我只能在一个参与者代码中使用MDC。

共有1个答案

岑熙云
2023-03-14

他们可以,但实际上没有。当你调用LoggingAdapter的成员时,你实际上调用actor的成员:

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信息。

P. S.akka可以更聪明,以隐式方式获取mdc信息,因此您可以将其捕获为闭包,类似于:

  implicit val metaMdc = getMetaMdc
  Future {

    log.warning(...)
  }

这里的问题是Akka必须在每次登录时将此metaMdc附加到当前线程的mdc(或者您必须以某种方式初始化它),因为SLF4J的mdc是线程本地的,所以每个线程都不同。所以,Akka不知道你要用哪个物理MDC来执行你的log.warning(...)

 类似资料:
  • 我很难弄清楚我如何知道我的演员何时从非演员代码中完成。 尝试使用akka演员进行并行执行,这似乎真的很好,但我需要知道何时所有人都完成了。 我添加了一个监督者演员,产生演员来做工作,从监督者/父演员,我可以观看孩子的终止消息。 我需要从akka actor系统之外的常规java代码中得到帮助,以确定我的监督actor是否完成。 这是否可能,请提供指针。 谢谢哈瑞

  • 我有一个AKKA模型,有一个主管演员,他创造了许多儿童演员。子参与者将处理一个事件并将消息发送到另一个服务(例如Kafka topic)。 目前,我有一个静态共享类,它在子参与者之间共享以发送消息,但在参与者模型中,我认为最好使用参与者来实现这一目的。 我想知道我如何才能创造一个演员,儿童演员可以分享它。如果supervisor actor创建了MessagePublisher actor,那么孩

  • 我正在尝试使用类型化执行器版本2.6.3和akka http版本10.1.11,而在非类型化执行器中都运行良好,现在我得到了编译错误

  • 我遇到了一个场景,我需要检查特定的参与者是否存在,这可以通过ActorSystem完成。actorSelection方法,指定参与者路径 但是,当本地节点上存在此类参与者时,此方法可以正常工作。若actor系统由多个节点组成,并且actor存在于另一个节点上,则该方法告诉我们actor不存在。若我给出指定远程参与者系统的字符串,那个么这个方法可以工作。但在actorSelection方法中指定远程

  • 我正在尝试在Scala上实现AKKA http和一些Actor。我用Akka创建了一个web应用程序。但我在一个或两个不同的路由上有这个错误/16。(显然是随机的): 服务器无法及时响应您的请求。请稍后再试! 你能给我解释一下为什么和怎么修吗?我对Akka真的是新手。 主类:

  • 概念 A Participant(参与者)是业务网络中的行为人(actor)。参与者可能是一个组织的分支。参与者可以创建资产,并与其他参与者交换资产。参与者通过提交交易来处理资产。 参与者拥有一组Identity文档,可以用来证明参与者的身份。例如,一个人可能有一个或多个以下身份文档证明他们是谁: 护照 驾驶执照 指纹 视网膜扫描 SSL证书 在Hyperledger Composer中,参与者可