【问题标题】:Custom Akka dispatcher in Play 2.2.xPlay 2.2.x 中的自定义 Akka 调度程序
【发布时间】:2013-12-30 11:17:13
【问题描述】:

我正在尝试在 Play 2.2.x 中的 application.conf 配置文件中配置自定义 Akka 调度程序,如下所示:

contexts.my-dispatcher {
  fork-join-executor {
    parallelism-max = 4
  }
}

此外,我以编程方式指定 withDispatcher

Akka.system.actorOf(Props(classOf[MyActor], arg1, arg2)
  .withDispatcher("contexts.my-dispatcher"), name = "MyActor")

或者,最好是我想直接在配置中进行

akka.actor.deployment {
  /MyActor {
    dispatcher = contexts.my-dispatcher
  }
}

这两种情况似乎都不适合我,因为在日志文件(application.log;通过 logback 配置;通过 ActorLogging 记录)我看到 default-dispatcher-[X] 正在使用。示例:

2013-12-30 11:37:40,999 - [DEBUG] - from x.y.z.MyActor in application-akka.actor.default-dispatcher-7
Some message

当我故意指定错误的调度程序名称时,我得到“未配置调度程序 [错误名称],使用默认调度程序”。由于上述配置/代码没有收到此警告,因此我假设通常应该没问题。有人能解释一下这里发生了什么吗?

logback appender 配置(application-logger.xml)是:

<appender name="FILE" class="ch.qos.logback.core.FileAppender">
  <file>${application.home}/logs/application.log</file>
  <encoder>
    <pattern>%date - [%level] - from %logger in %thread %n%message%n%xException%n</pattern>
  </encoder>
</appender>

【问题讨论】:

    标签: playframework akka playframework-2.2


    【解决方案1】:

    ActorLogging 是异步的。当您使用 ActorLogging 进行日志记录时,它会向日志记录参与者发送一条消息,该参与者默认在默认调度程序上运行。 Logback 记录调用它的线程,这将是 ActorLogging 演员线程,而不是您的演员线程。 Logback 不了解 Actor,因此它不知道日志消息最初来自哪个调度程序。

    尝试使用 logback(或 slf4j)直接进行日志记录,您应该会看到正确的调度程序。

    【讨论】:

    • 根据 James 的回答,我发现有一个所谓的映射诊断上下文 (MDC),它捕获执行日志记录的源线程。请参阅doc.akka.io/docs/akka/2.2.0/scala/logging.html 所以在 logback 配置中使用 %X{sourceThread} 可以提供正确的信息并允许继续使用异步 ActorLogging 工具。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-11
    • 2013-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多