重新发送" init"关于Akka actor重启的消息

时间:2016-09-13 07:45:54

标签: java scala akka actor akka-supervision

我有一个孩子"消费者"连接到某些外部数据流的actor,解析其消息并在应用程序内进一步转发它们。这个"制作人" system具有pub-sub体系结构,但在重新连接后不会还原订阅。目前我将这些订阅存储在父actor中并在supervisor中重新发送,但问题是当子进程重新启动时,它们会被转发到死信队列。我可以尝试在延迟一段时间后将这些安排给父母,但这可能会影响订阅顺序,这很重要。

那么我该如何提供这些"重新订阅"在孩子重新启动时给孩子的消息?

2 个答案:

答案 0 :(得分:1)

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

在儿童演员的preRestart上,您需要通知主管儿童演员将重新开始,主管应该暂停其发送消息。

在关于儿童演员的postRestart上,您需要通知主管孩子可用并且主管应该恢复发送消息。

答案 1 :(得分:0)

您可以使用

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

,再次存储和发送。