【问题标题】:Where do enqueued messages go after an actor is stopped Akka演员停止后排队的消息去哪里 Akka
【发布时间】:2020-08-20 14:28:36
【问题描述】:

所以我知道,如果您向死去的 Actor 发送消息,消息会发送到 DeadLetters,但是对于该 Actor 已经排队的消息会发生什么情况。他们也会被转发到那里还是迷路了?

【问题讨论】:

    标签: akka dead-letter


    【解决方案1】:

    一般来说,您不能对死信的交付做出太多假设。作为docs on dead letters say

    无法传递(并且可以确定)的消息将传递给名为/deadLetters 的合成参与者。这种交付是在尽力而为的基础上进行的;它甚至可能在本地 JVM 中失败(例如在 actor 终止期间)。通过不可靠的网络传输发送的消息将丢失而不会变成死信。

    但是,Akka 似乎确实在努力将已经为演员排队的死信消息转发到。这是来自cleanup function for Mailbox 的sn-p,它在actor 关闭后被调用:

      /**
       * Overridable callback to clean up the mailbox,
       * called when an actor is unregistered.
       * By default it dequeues all system messages + messages and ships them to the owning actors' systems' DeadLetterMailbox
       */
      protected[dispatch] def cleanUp(): Unit =
        if (actor ne null) { // actor is null for the deadLetterMailbox
          val dlm = actor.dispatcher.mailboxes.deadLetterMailbox
          var messageList = systemDrain(new LatestFirstSystemMessageList(NoMessage))
          while (messageList.nonEmpty) {
            // message must be “virgin” before being able to systemEnqueue again
            val msg = messageList.head
            messageList = messageList.tail
            msg.unlink()
            dlm.systemEnqueue(actor.self, msg)
          }
    
          if (messageQueue ne null) // needed for CallingThreadDispatcher, which never calls Mailbox.run()
            messageQueue.cleanUp(actor.self, actor.dispatcher.mailboxes.deadLetterMailbox.messageQueue)
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-12-02
      • 2015-05-06
      • 2019-01-01
      • 2018-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-14
      相关资源
      最近更新 更多