Куда попадают поставленные в очередь сообщения после остановки актера Akka

Итак, я понимаю, что если вы отправляете сообщение мертвому актеру, сообщение отправляется в DeadLetters, но что происходит с сообщениями, которые уже были поставлены в очередь для этого актера? Они тоже туда пересылаются или теряются?


person HashBr0wn    schedule 05.05.2020    source источник


Ответы (1)


В общем, вы не можете предполагать многого о доставке мертвых букв. Как говорится в документах по мертвым письмам< /а>:

Сообщения, которые не могут быть доставлены (и для которых это можно установить), будут доставлены синтетическому актору с именем /deadLetters. Эта доставка происходит на основе максимальных усилий; это может привести к сбою даже в локальной JVM (например, во время завершения работы актера). Сообщения, отправленные через ненадежные сетевые транспорты, будут потеряны и не будут обнаружены как мертвые письма.

Тем не менее, похоже, что Akka действительно пытается пересылать недоставленные сообщения, которые уже были поставлены в очередь для актера. Это фрагмент из cleanup функция для Mailbox, которая вызывается после завершения работы актера:

  /**
   * 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)
    }
}
person Alec    schedule 06.05.2020