2017-02-04 127 views
3

我有一个父母演员和孩子。每个小孩演员控制一个设备。当我创建它们时,我会为所有的小孩演员提供一个uuid。Akka:如何删除儿童演员

每一个儿童演员是由设备配置,创造了当时的配置改变,我想重新由演员:

  • 停止旧之一:

    最终未来停止= gracefulStop( actorRef,Duration.create(1,TimeUnit.SECONDS)); Await.result(stopped,Duration.create(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代码不消除孩子的演员,我的问题是:我怎么能删除这个孩子的演员?

我也试图通过PoisonPill除去演员:

actorRef.tell(PoisonPill.getInstance(), getSelf()); 

回答

1

official documentation

请记住,一个演员停止,它的名字被注销 是独立的事件,彼此异步发生。 因此,可能会在 gracefulStop()返回后找到名称仍在使用中。为了保证正确注销, 仅重用来自您控制的主管人员的名称,并且仅在 响应终止消息时使用名称,即不适用于顶级参与者。

因此,只有在接收到主管参与者应注册的Terminated消息后,才应该使用回收名称创建主角。