参与者被停止后,排队的消息会去哪里Akka

zbdgwd5y  于 2022-11-06  发布在  其他
关注(0)|答案(1)|浏览(139)

所以我理解如果你发送一个消息给一个死的参与者,这个消息会被送到DeadLetters,但是已经为这个参与者排队的消息会发生什么呢?它们也会被转发到那里还是会丢失?

dy1byipe

dy1byipe1#

总的来说,你不能对寄往死信做太多假设,就像那些关于死信的医生说的那样:
无法传递的消息(以及可以确定的消息)将被传递给一个名为/deadLetters的合成参与者。即使在本地JVM中也可能失败(例如在执行元终止期间)。2通过不可靠的网络传输发送的消息将丢失,而不会显示为死信。
但是,Akka似乎确实努力将已经为参与者排队的消息转发到死信。这是Mailboxcleanup函数的一个片段,该函数在参与者关闭后被调用:

/**
   * 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)
    }
}

相关问题