【发布时间】:2020-08-20 14:28:36
【问题描述】:
所以我知道,如果您向死去的 Actor 发送消息,消息会发送到 DeadLetters,但是对于该 Actor 已经排队的消息会发生什么情况。他们也会被转发到那里还是迷路了?
【问题讨论】:
标签: akka dead-letter
所以我知道,如果您向死去的 Actor 发送消息,消息会发送到 DeadLetters,但是对于该 Actor 已经排队的消息会发生什么情况。他们也会被转发到那里还是迷路了?
【问题讨论】:
标签: akka dead-letter
一般来说,您不能对死信的交付做出太多假设。作为docs on dead letters say:
无法传递(并且可以确定)的消息将传递给名为
/deadLetters的合成参与者。这种交付是在尽力而为的基础上进行的;它甚至可能在本地 JVM 中失败(例如在 actor 终止期间)。通过不可靠的网络传输发送的消息将丢失而不会变成死信。
但是,Akka 似乎确实在努力将已经为演员排队的死信消息转发到。这是来自cleanup function for Mailbox 的sn-p,它在actor 关闭后被调用:
/**
* 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)
}
}
【讨论】: