我正在尝试使用ActorFor获取现有的ActorRef,或者如果它不存在则创建一个新的ActorRef。我有以下代码,但它似乎没有按预期工作。 .isTerminated()始终为真。
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");
我在这里缺少什么?提前谢谢。
答案 0 :(得分:24)
Get-or-create只能由指定actor的 parent 执行,因为只有父级才能创建该actor,并且只有父级可以一致地执行此操作(即没有竞争条件)。在演员中你可以做到
// assuming a String name like "fred" or "barney", i.e. without "/"
final Option<ActorRef> child = child(name);
if (child.isDefined())
return child.get();
else
return getContext().actorOf(..., name);
不要在顶层执行此操作(即使用system.actorOf
),因为那时您无法确定谁在请求创建中“获胜”并且依赖于用户监护人并不是一个好的监督策略。
答案 1 :(得分:2)
将查找更改为:
system.actorFor("/user/" + name)
如果这是您正在查找的本地演员,则不需要“akka:// System”部分。这假设这个actor已经在代码的其他地方启动了。如果不是它将无法正常工作。
答案 2 :(得分:1)
根据给定的代码,您调用actorFor
来查找不存在的actor。在调用actorOf
之前,actor不存在。