【问题标题】:"Dead letters encountered" as soon as actors are placed into router将演员放入路由器后立即“遇到死信”
【发布时间】:2013-09-24 00:30:22
【问题描述】:

这就是我的发现,而我终其一生都无法找到原因。我正在创建“打印机”actor,它们基本上要么什么都不做,要么根据他们收到的消息类型打印消息。

class Printer extends Actor {
    def receive = {
        case m: SomeMessage => println( m.text )
        case _ =>
    }
}

我正在创建几个这样的演员:

val actor4 = system.actorOf(Props[Printer], "t-4")
val actor5 = system.actorOf(Props[Printer], "t-5")
val actor6 = system.actorOf(Props[Printer], "t-6")

并将它们放入向量中:

val routees2 = Vector[ActorRef](actor4, actor5, actor6)

我这样做是为了将它们放入路由器中(它们将在路由器的控制之下)。到目前为止,当我运行规范时,我没有任何问题。一旦我将它们放入路由器并运行规范,我就会遇到问题。这是路由器:

val router = system.actorOf(Props[Printer].withRouter(
    BroadcastRouter(routees = routees2)), "router-to-transformers")

现在,当我运行规范时,我有各种各样的死信......

[INFO] [09/23/2013 17:10:21.468] [spider-akka.actor.default-dispatcher-6] [akka://spider/user/router-to-transformers] Message [akka.dispatch.sysmsg.DeathWatchNotification] from Actor[akka://spider/user/router-to-transformers#-1845250548] to Actor[akka://spider/user/rout
er-to-transformers#-1845250548] 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'.
[INFO] [09/23/2013 17:10:21.468] [spider-akka.actor.default-dispatcher-6] [akka://spider/user/router-to-transformers] Message [akka.dispatch.sysmsg.DeathWatchNotification] from Actor[akka://spider/user/router-to-transformers#-1845250548] to Actor[akka://spider/user/rout
er-to-transformers#-1845250548] was not delivered. [2] 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'.
[INFO] [09/23/2013 17:10:21.468] [spider-akka.actor.default-dispatcher-6] [akka://spider/user/router-to-transformers] Message [akka.dispatch.sysmsg.DeathWatchNotification] from Actor[akka://spider/user/router-to-transformers#-1845250548] to Actor[akka://spider/user/rout
er-to-transformers#-1845250548] was not delivered. [3] 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'.

对于我的一生,我无法弄清楚这里发生了什么。我添加了一个指向测试的 sn-p 的链接。 sn-p 中的编号很奇怪,因为我已经删除了一堆不同的尝试,这些尝试被注释掉了,以免弄乱 sn-p。我专注于这个死信问题,因为我觉得当我添加更多演员并实际上开始传递消息时,事情没有得到传递...... http://snipt.org/AhVf0

值得一提的是,这些演员都是本地人。我读过一些关于 actorFor 被贬值的内容,我想知道它是否正在被使用,并且部分是导致我的问题的原因?虽然这里有很多活动部件,但没有很多稳定、全面的文档。任何帮助将不胜感激。

【问题讨论】:

    标签: scala akka


    【解决方案1】:

    您在这里看到的是 DeathWatchNotifications 未处理,这意味着参与者(路由器)在终止时仍在监视其子节点。这不会自动表示麻烦as documented(但我们应该在此特定消息的情况下更清楚地说明)。在这种情况下,摆脱此消息的唯一方法是确保路由器和路由不会“同时”终止。

    【讨论】:

    • 我没有使用:val router = system.actorOf(Props(CreateDiagnostic).withRouter( BroadcastRouter(routees = routees2)), "router") 语法,而是改为:val router = system.actorOf(Props(createDiagnostic).withRouter( BroadcastRouter(nrOfInstances = 3)), "router"),这使得死信消失了。我假设第二个实现是更清洁的方法吗?一如既往,谢谢。
    【解决方案2】:

    我的 akka 项目遇到了同样的问题。这是我的问题"Dead Letters encountered" error while running AKKA remote actors

    当没有更多的worker Actor接收master发送的消息时,通常会发生死信。当你的主人向它发送任务或消息时,你应该确保你的工人演员是活着的。

    【讨论】:

      【解决方案3】:

      一种解决方案是使用Scheduler,而不是

      context.stop(self)
      

      使用:

      system.scheduler.scheduleOnce(1 second) {
        self ! PoisonPill
      }
      

      【讨论】:

        猜你喜欢
        • 2013-09-21
        • 2017-08-25
        • 2014-06-13
        • 1970-01-01
        • 1970-01-01
        • 2014-07-20
        • 2019-12-03
        • 2017-09-09
        • 1970-01-01
        相关资源
        最近更新 更多