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

在Akka中,我可以在实例字段中保留ActorRef吗?,akka,Akka,如果我有一个参与者向另一个参与者发送消息,我是否应该在每次我想向该参与者发送消息时获取对该参与者的引用(例如,context.actorSelection(somePath)),或者我可以在我的参与者初始化后执行一次,然后重用ActorRef?您可以重用ActorRefs,这就是他们的目的 我认为需要区分参与者失败并被其主管重新启动和参与者被明确停止。如果您有一个以某种方式获得的ActorRef(通过ActorSelection查找并解决它,或者在创建时碰巧有它),并且底层actor实例失败并由

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

您可以重用ActorRefs,这就是他们的目的


我认为需要区分参与者失败并被其主管重新启动和参与者被明确停止。如果您有一个以某种方式获得的
ActorRef
(通过
ActorSelection
查找并解决它,或者在创建时碰巧有它),并且底层actor实例失败并由其主管重新启动,那么
ActorRef
仍然可以正常工作。即使参与者在失败和重新启动期间从技术上停止(
postStop
),它的名称永远不会被释放,引用它的任何引用仍然有效

现在,如果您明确地停止了该actor,然后又启动了一个具有相同名称(因此路径相同)的新actor,
ActorRef
s在停止前引用它将不起作用。它们引用的actor实例已停止,因此这些引用无效,即使稍后使用相同的名称和路径启动了新实例


最后,您可以使用
ActorSelection
s来回避上述段落中描述的问题。如果您将
.actorSelection
的结果保留为
actorSelection
,而不将其解析为单个
ActorRef
,则您将继续能够通过它发送消息(
actorSelection
支持tell/
)对于它所代表的参与者,即使最初停止了第一个实例,之后又启动了一个同名的新实例。

该文档中有一些东西让我怀疑ActorRefs的可重用性。“当参与者终止时,其引用将指向死信邮箱”。“参与者引用指定单个参与者,并且引用的生命周期与该参与者的生命周期匹配”。所以如果一个演员死了,听起来这个演员对我没有好处。如果我每次都打电话给actorSelection,Akka会确保我总是得到一个现场演员的推荐吗?不,演员选择根本不能保证有任何演员在你要求的路径上。我没有很好地回答我的问题。如果我有一个ActorRef给一个已经去世的演员,根据你链接到的参考文档,我猜ActorRef对我再也没有好处了。或者Akka是否以某种方式确保以透明的方式创建Actor的新实例,并且我可以继续使用ActorRef?