Итак, я понимаю, что если вы отправляете сообщение мертвому актеру, сообщение отправляется в DeadLetters, но что происходит с сообщениями, которые уже были поставлены в очередь для этого актера? Они тоже туда пересылаются или теряются?
Куда попадают поставленные в очередь сообщения после остановки актера Akka
Ответы (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)
}
}