我有一个非常简单的结构,基于
Scala中的Akka actor,但我一直收到关于未传递消息的警告.这是主类的代码,Collector是一个扩展Actor的独立类:
object Executor extends App { class ExecutorMaster extends Actor { def receive() = { case _ => Executor.actorSystem.actorOf(Props[Collector],name = "Collector") ! true } } val actorSystem = ActorSystem("ReadScheduler") private val app = actorSystem.actorOf(Props[ExecutorMaster],name = "Executor") app ! true }
消息未传递给收集器,代码的结果是:
[04/27/2014 18:09:05.518]
[ReadScheduler-akka.actor.default-dispatcher-3]
[akka://ReadScheduler/user/Collector] Message [java.lang.Boolean] from
Actor[akka://ReadScheduler/user/Executor#2127791644] to
Actor[akka://ReadScheduler/user/Collector#337715308] was not
delivered. [1] dead letters encountered. This logging can be turned
off or adjusted with configuration settings ‘akka.log-dead-letters’
and ‘akka.log-dead-letters-during-shutdown’.
这个消息传递失败的原因是什么?这个概念中是否有一些我一直缺失的东西?
解决方法
您应该使用层次结构 – 将该Collector作为ExecutorMaster的子项启动.
你在receive方法中所做的是尝试创建一个与在ExecutorMaster接收的第一条消息之后创建的另一个同名的actor.
考虑使用:
val collector = context.actorOf(Props[Collector],name = "Collector") def receive = { case _ => collector ! true }
您还应该使用案例对象而不是原语来标识true的含义.