Playframework 游戏2.2.x中的自定义Akka调度程序

Playframework 游戏2.2.x中的自定义Akka调度程序,playframework,akka,playframework-2.2,Playframework,Akka,Playframework 2.2,我正试图在application.conf配置文件的Play 2.2.x中配置自定义Akka dispatchers,如下所示: contexts.my-dispatcher { fork-join-executor { parallelism-max = 4 } } 此外,我还以编程方式指定了和Dispatcher Akka.system.actorOf(Props(classOf[MyActor], arg1, arg2) .withDispatcher("contex

我正试图在
application.conf
配置文件的Play 2.2.x中配置自定义Akka dispatchers,如下所示:

contexts.my-dispatcher {
  fork-join-executor {
    parallelism-max = 4
  }
}
此外,我还以编程方式指定了
和Dispatcher

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记录)中,我看到正在使用
默认调度程序-[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)为:


${application.home}/logs/application.log
%日期-[%level]-来自%logger,位于%thread%n%消息%n%xException%n

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


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

根据James的回答,我发现有一个所谓的映射诊断上下文(Mapped Diagnostic Context,MDC),它捕获执行日志记录的源线程。请参阅,在logback配置中使用%X{sourceThread}提供了正确的信息,并允许继续使用异步ActorLogging工具。
<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>