在Akka中,我可以在实例字段中保存ActorRef吗?

Kev*_*dge 2 akka

如果我有一个向另一个actor发送消息的actor,我是否应该context.actorSelection(somePath)每次想要向其发送消息时获取对该actor的引用(例如),或者我可以在我的actor初始化时再执行一次,然后重用ActorRef

cmb*_*ter 6

我认为需要区分演员失败和被其主管重新启动以及演员被明确停止.如果你有一个ActorRef你以某种方式获得的东西(通过查找并通过它ActorSelection刚刚创建它来解决它)并且底层actor实例失败并由其主管重新启动,那么它ActorRef仍然会工作得很好.尽管演员在失败和重启期间(postStop将被调用)在技​​术上停止,但它的名称永远不会被释放,并且任何引用它的引用仍然有效.

现在,如果你明确地停止了那个actor,然后又启动了一个具有相同名称的新的(并且因此相同的路径),ActorRef那么提到它的预先停止将不起作用.他们引用的actor实例已停止,因此即使稍后以相同的名称和相同的路径启动新实例,这些引用也是无效的.

最后,您可以使用ActorSelections来解决上一段中描述的问题.如果你保持的结果.actorSelection作为ActorSelection和不其解析到一个单一的ActorRef,那么你将继续能够通过它来发送邮件(ActorSelection支持告诉/ !),并通过它代表一个演员,即使一审初次停止和稍后将启动同名的新实例.