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

时间:2013-04-28 21:51:45

标签: java akka actor

我正在尝试使用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"); 

我在这里缺少什么?提前谢谢。

3 个答案:

答案 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不存在。