在 Akka actor 重启时重新发送 "init" 消息

Resend "init" message on Akka actor restart

我有一个 child "consumer" actor,它连接到一些外部数据流,解析它的消息并将它们进一步转发到应用程序内部。此 "producer" 系统具有 pub-sub 架构,但在重新连接后不会恢复订阅。目前我将这些订阅存储在 parent 演员中并在主管中重新发送它们,但问题是当 child 重新启动时,它们被转发到死信队列。我本可以尝试在一些延迟后将这些安排到 parent,但这可能会干扰订阅顺序,这很重要。

那么如何在 child 重新启动时将这些 "resubscription" 消息传递给它?

您可以通过

订阅死信
context.system.eventStream.subscribe(myListenerActorRef, classOf[DeadLetter])
...
def receive = {
  case DeadLetter(msg, from, to) =>
  //Do my custom stuff here
}

,存储并再次发送。

您可以使用 Restart Hooks (http://doc.akka.io/docs/akka/snapshot/scala/actors.html#Restart_Hooks):preRestart 和 postRestart api。

在子 actor 的 preRestart 上,您需要通知 supervisor 子 actor 将重新启动并且 supervisor 应该暂停它的消息发送。

在子 actor 的 postRestart 上,您需要通知 supervisor 子 actor 可用并且 supervisor 应该恢复发送消息。