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