Akka Scala演员的死信

时间:2014-04-27 19:03:41

标签: scala akka actor dead-letter

我有一个非常简单的结构,基于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

}

消息未传递给收集器,代码的结果为:

  

[2014年4月27日18:09:05.518]   [ReadScheduler-akka.actor.default-调度-3]   [akka:// ReadScheduler / user / Collector]消息[java.lang.Boolean]来自   演员[akka:// ReadScheduler / user / Executor#2127791644]来   演员[akka:// ReadScheduler / user / Collector#337715308]不是   交付。 [1]遇到死信。可以转换此日志记录   关闭或调整配置设置'akka.log-dead-letters'   和'akka.log-dead-letters-during-shutdown'。

此消息传递失败的原因是什么?在这个概念中是否有一些我一直缺失的东西?

1 个答案:

答案 0 :(得分:3)

您应该使用层次结构 - 将Collector作为ExecutorMaster的子项启动。

您在receive方法中所做的是尝试创建一个与ExecutorMaster收到的第一条消息之后创建的另一个名称相同的actor。

考虑使用:

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

您还应该使用case object而非原语来识别true的含义。