2017-02-04 129 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消息後,才應該使用回收名稱創建主角。