我有一个父母演员和孩子。每个儿童演员控制一个设备。当我创建它们时,我会给所有儿童演员提供一个uuid。
每个子actor都是由设备配置创建的,当配置发生变化时,我想通过以下方式重新创建actor:
停止旧的:
final Future stopped = gracefulStop(actorRef,Duration.create(1,TimeUnit.SECONDS)); Await.result(已停止,持续时间。创建(1,TimeUnit.SECONDS));
重新创建一个新的:
context.actorOf(Props.create( GateActor.class, () - >新的GateActor(hardwareRouterActorRef,设置)), settings.getUuid())
但它引发了一个例外:
akka.actor.InvalidActorNameException: actor name [6237255c-851b-47d2-ac31-03c7635e6537] is not unique!
我认为gracefulStop代码不会删除子actor,我的问题是:如何删除子actor?
我还尝试通过PoisonPill删除演员:
actorRef.tell(PoisonPill.getInstance(), getSelf());
答案 0 :(得分:2)
请记住,演员停止并取消注册其名称 是彼此异步发生的独立事件。 因此,您可能会发现该名称仍在使用之后 gracefulStop()返回。为了保证适当的注销, 只能在您控制的主管内重复使用名称,且仅限于 对终止消息的响应,即不适用于顶级演员。
因此,只有在收到主管演员应注册的Terminated
消息后,才应使用循环名称创建actor的创建。