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>