我有一个非常简单的结构,基于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'。
此消息传递失败的原因是什么?在这个概念中是否有一些我一直缺失的东西?
答案 0 :(得分:3)
您应该使用层次结构 - 将Collector
作为ExecutorMaster
的子项启动。
您在receive
方法中所做的是尝试创建一个与ExecutorMaster
收到的第一条消息之后创建的另一个名称相同的actor。
考虑使用:
val collector = context.actorOf(Props[Collector], name = "Collector")
def receive = {
case _ => collector ! true
}
您还应该使用case object
而非原语来识别true
的含义。