Akka Scala 演员中的死信

Posted

技术标签:

【中文标题】Akka Scala 演员中的死信【英文标题】:Dead-letter in Akka Scala actors 【发布时间】:2014-06-13 04:59:10 【问题描述】:

我有一个非常简单的结构,基于 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-dispatcher-3] [akka://ReadScheduler/user/Collector] 消息 [java.lang.Boolean] 来自 Actor[akka://ReadScheduler/user/Executor#2127791644] 到 演员[akka://ReadScheduler/user/Collector#337715308] 不是 发表。 [1] 遇到死信。这个日志记录可以转 关闭或使用配置设置“akka.log-dead-letters”进行调整 和'akka.log-dead-letters-during-shutdown'。

邮件发送失败的原因是什么?我在这个概念中有什么一直遗漏的地方吗?

【问题讨论】:

【参考方案1】:

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

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

考虑使用:

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

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

【讨论】:

以上是关于Akka Scala 演员中的死信的主要内容,如果未能解决你的问题,请参考以下文章

Akka演员(Scala)如何在内存不足时获得堆转储[重复]

如何在akka中扩展超级演员的行为

如何在 Scala 中优先考虑演员之间发送的消息?

Scala如何使用akka actor有效地处理超时操作

如何访问通过 guice 创建的 akka 系统?

每个数据库实体一个 Akka 演员?