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