Play 2.2.x中的自定义Akka调度程序

时间:2013-12-30 11:17:14

标签: playframework akka playframework-2.2

我试图在application.conf配置文件中配置Play 2.2.x中的自定义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

当我故意指定错误的调度程序名称时,我使用default-dispatcher"得到未配置的#34; Dispatcher [错误名称]。由于我没有通过上述配置/代码得到此警告,我假设一般情况下它应该没问题。有人可以对这里发生的事情有所了解吗?

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>

1 个答案:

答案 0 :(得分:1)

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

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