获得现有或创建新的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不存在。