Akka Scala演员中的死信

4

我有一个基于Scala中Akka actors的非常简单的结构,但是我一直收到有关未传递消息的警告。这是主类的代码,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

}

消息未被传递到Collector,代码的结果如下:

[04/27/2014 18:09:05.518] [ReadScheduler-akka.actor.default-dispatcher-3] [akka://ReadScheduler/user/Collector] 消息 [java.lang.Boolean] 来自 Actor[akka://ReadScheduler/user/Executor#2127791644] 到 Actor[akka://ReadScheduler/user/Collector#337715308] 未能传递。遇到了 [1] 封死信。此日志记录可以通过配置设置 'akka.log-dead-letters' 和 'akka.log-dead-letters-during-shutdown' 进行关闭或调整。

导致消息传递失败的原因是什么?我是否在概念上一直缺少某些东西?
1个回答

3

你应该使用层级结构 - 将Collector作为ExecutorMaster的子级启动。

receive方法内部,你正在尝试创建一个与ExecutorMaster接收到的第一条消息后创建的另一个actor名称相同的actor。

考虑使用:

val collector = context.actorOf(Props[Collector], name = "Collector")
def receive = {
    case _ => collector ! true
}

你还应该使用一个case object而不是原始类型来标识true的含义。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接