获得现有或创建新的akka​​演员

我正在尝试使用ActorFor获取现有的ActorRef,或者如果它不存在则创建一个新的ActorRef。 我有以下代码,但它似乎没有按预期工作。 .isTerminated()始终为true。

ActorSystem system = ActorSystem.create("System"); ActorRef subscriberCandidate = system.actorFor("akka://System/user/"+name); if (subscriberCandidate.isTerminated()) { ActorRef subscriber = system.actorOf(new Props(new UntypedActorFactory() { public UntypedActor create() { return new Sub(name,link); } }), name); System.out.println(subscriber.path().toString() + " created"); } else System.out.println("already exists"); 

我在这里想念的是什么? 提前致谢。

Get或create只能由指定actor的父级执行,因为只有父级才能创建该actor,并且只有父级可以一致地执行(即没有竞争条件)。 在演员中你可以做到

 // assuming a String name like "fred" or "barney", ie without "/" final Option child = child(name); if (child.isDefined()) return child.get(); else return getContext().actorOf(..., name); 

不要在顶级(即使用system.actorOf )执行此操作,因为那时您无法确定谁在请求创建中“获胜”并且依赖于用户监护人并不是一个好的监督策略。

将您的查找更改为:

 system.actorFor("/user/" + name) 

如果这是您正在查找的本地演员,则不需要“akka:// System”部分。 这假设这个actor已经在你的代码的其他地方启动了。 如果不是它将无法工作。

基于给定的代码,您调用actorFor来查找不存在的actor。 在调用actorOf之前,actor不存在。