Akka:如何移除子Actor。

4
我有一个父级Actor和其子级。每个子级Actor都控制着一个设备,当我创建子级Actor时,为所有子级Actor分配一个uuid。
每个子级Actor都是通过设备配置创建的,当配置更改时,我想通过以下方式重新创建Actor:
停止旧Actor: final Future stopped = gracefulStop(actorRef, Duration.create(1, TimeUnit.SECONDS)); Await.result(stopped, Duration.create(1, TimeUnit.SECONDS));
重新创建新Actor: context.actorOf(Props.create( GateActor.class, () -> new GateActor(hardwareRouterActorRef, settings)), settings.getUuid())
但它抛出异常: akka.actor.InvalidActorNameException: actor name [6237255c-851b-47d2-ac31-03c7635e6537] is not unique!
我认为gracefulStop代码没有删除子级Actor,我的问题是:如何删除子级Actor?
我还尝试使用PoisonPill删除Actor:
actorRef.tell(PoisonPill.getInstance(), getSelf());
1个回答

4

来自官方文档

请记住,停止一个actor和其名称被注销是两个异步发生的事件。因此,在 gracefulStop() 返回后,您可能会发现名称仍在使用中。为了保证正确的注销,请仅从您控制的supervisor内部重新使用名称,并且仅响应于Terminated消息,即不适用于顶层actors。

因此,您应该仅在接收到supervisor actor注册的 Terminated 消息后,使用已回收名称创建actor。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接