我有一個演員p: ParentActor
,我想要做一些清理工作,當它通過使用postStop
方法停止。其中一項工作涉及向兒童演員c: ChildActor
發送消息。之後,應該停止c
,然後p
。但是,一旦context.stop(p)
被稱爲c
似乎立即停止並且無法接收消息。不要立刻停止孩子Akka演員時,父母演員停止
下面是想我做的一個例子:
class ParentActor extends Actor {
...
override def postStop {
logger.info("Shutdown message received. Sending message to child...")
val future = c ? "doThing"
logger.info("Waiting for child to complete task...")
Await.result(future, Duration.Inf)
context.stop(c)
logger.info("Child stopped. Stopping self. Bye!")
context.stop(self)
}
}
結果錯誤消息:
[ERROR] [SetSystem-akka.actor.default-dispatcher-5] [akka://SetSystem/user/ParentActor] Recipient[Actor[akka://SetSystem/user/ParentActor/ChildActor#70868360]] had already been terminated. Sender[Actor[akka://SetSystem/user/ParentActor#662624985]] sent the message of type "java.lang.String".
另一種方法是發送p
一條消息說要關機,有上述行爲發生的結果,但使用內置的停止功能似乎更好。
PS。這是一個新的應用程序,因此歡迎使用設計替代品