Scala Akka-如何处理终止

Scala Akka-如何处理终止,scala,akka,Scala,Akka,我在akka应用程序中使用redis react nb库。不幸的是,当与redis的连接丢失时,库将通过context stop self 这意味着我的应用程序将收到如下终止通知: def receive: Actor.Receive = { case Terminated(actorRef) => ... } 所以我想知道在这里做什么。理想情况下,我希望重新启动所有子actor,以便使用新的redis连接对它们进行初始化—基本

我在akka应用程序中使用redis react nb库。不幸的是,当与redis的连接丢失时,库将通过
context stop self

这意味着我的应用程序将收到如下终止通知:

def receive: Actor.Receive = {
          case Terminated(actorRef) =>
            ...
        }
所以我想知道在这里做什么。理想情况下,我希望重新启动所有子actor,以便使用新的redis连接对它们进行初始化—基本上将actor系统重置为其初始状态


我在概念上遗漏了什么吗?或者有没有一种方法可以让参与者在不接收异常的情况下重新启动其所有子级<代码>自我!重新启动所有或类似的功能?

一种可能的解决方案是查看
监管策略的实施。重新启动
。不幸的是,实现使用了
InternalActorRef

final def restartChild(子级:ActorRef,原因:Throwable,suspendFirst:Boolean):单位={
val c=子.asInstanceOf[InternalActorRef]
if(suspendFirst)c.suspend()
c、 重新启动(原因)
}
所以我假设没有内置的解决方案,你应该自己做

def接收={
案例终止(actorRef)=>self!重新启动所有
案例重启全部=>
context.children.foreach(!毒丸)
//重新启动所有必要的参与者
}

另一种看待这一点的方式是,您所说的参与者依赖于redis参与者,没有它它它无法继续工作。在这种情况下,最好将其升级为其父级故障,并让其重新启动。如果您不处理终止的消息,则将抛出DeathPactException,但您必须在父级中安装适当的supervisorStrategy,因为该策略的默认值是终止子级。我建议您在收到终止的消息时定义并抛出RedisFailedException。

您计划为每个孩子打开一个到redis的连接,还是让一个参与者保持连接并从所有孩子参与者那里获取消息?