В общем, насчет доставки мертвых писем многого нельзя. Как сказано в документах по мертвым письмам: :
Сообщения, которые не могут быть доставлены (и для которых это может быть установлено), будут доставлены синтетическому c актеру с именем /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)
}
}