在Akka中,我可以在实例字段中保存ActorRef吗?
问题描述:
如果我有一个演员向另一个演员发送消息,我应该每次向该演员发送一条消息时获得对该演员的引用(例如context.actorSelection(somePath)
),或者我可以在演员初始化时执行一次演示重复使用ActorRef
?在Akka中,我可以在实例字段中保存ActorRef吗?
答
我认为需要区分演员失败,正在重新启动由它的主管和一个演员被明确停止之间进行。如果您有以某种方式获得的ActorRef
(查看并通过ActorSelection
解决该问题,或刚刚创建时发生),并且潜在的actor实例失败并由其主管重新启动,那么ActorRef
仍然可以正常工作。即使演员技术上在失败和重新启动期间停止(将调用postStop
),它的名字永远不会被释放,并且任何引用它的引用仍然有效。
现在,如果你明确停止的演员,后来开始了一个新的具有相同的名称(因此相同的路径),ActorRef
s表示称它预先回采将无法正常工作。他们提到的actor实例被停止,因此这些ref是无效的,即使后来一个新的实例以相同的名称和相同的路径启动。
最后,您可以使用ActorSelection
来解决上述段落中描述的问题。如果将.actorSelection
的结果保留为ActorSelection
,并且不将其解析为单个ActorRef
,则您仍然可以通过它发送消息(ActorSelection
支持tell/!
)以及由它代表的actor,即使第一个实例最初停止,并在稍后启动同一名称的新实例。
该文档中有些东西让我怀疑ActorRefs的可重用性。 “当演员被终止时,其参考将指向死信邮箱”。 “演员参考指定一个演员,参考的生命周期与演员的生命周期相匹配”。所以如果一个演员死亡,这听起来像ActorRef对我不好。如果我每次都打电话给actorSelection,Akka是否会确保我总是能够获得对现场演员的参考? – 2014-11-23 22:24:48
不,根本不能保证演员选择在你请求的路径上有演员。 – Ryan 2014-11-23 22:42:30
我没有把我的问题说得很好。如果我有一个ActorRef给已经去世的Actor,那么我猜猜ActorRef对我来说不再适合我,因为它基于你链接到的参考文档。或者Akka以某种方式确保Actor的新实例是透明创建的,并且我可以继续使用ActorRef? – 2014-11-23 22:50:57