阿卡:如何删除儿童演员

时间:2017-02-04 14:29:11

标签: java akka

我有一个父母演员和孩子。每个儿童演员控制一个设备。当我创建它们时,我会给所有儿童演员提供一个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());

1 个答案:

答案 0 :(得分:2)

来自official documentation

  

请记住,演员停止并取消注册其名称   是彼此异步发生的独立事件。   因此,您可能会发现该名称仍在使用之后   gracefulStop()返回。为了保证适当的注销,   只能在您控制的主管内重复使用名称,且仅限于   对终止消息的响应,即不适用于顶级演员。

因此,只有在收到主管演员应注册的Terminated消息后,才应使用循环名称创建actor的创建。