Akka Scala演员的死信

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

相关文章

共收录Twitter的14款开源软件,第1页Twitter的Emoji表情 Tw...
Java和Scala中关于==的区别Java:==比较两个变量本身的值,即...
本篇内容主要讲解“Scala怎么使用”,感兴趣的朋友不妨来看看...
这篇文章主要介绍“Scala是一种什么语言”,在日常操作中,相...
这篇文章主要介绍“Scala Trait怎么使用”,在日常操作中,相...
这篇文章主要介绍“Scala类型检查与模式匹配怎么使用”,在日...