8

我正在尝试使用 ActorFor 获取现有的 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"); 

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

4

3 回答 3

26

Get-or-create 只能由指定actor的级执行,因为如果actor不存在,只有父级可以创建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),因为这样您就无法确定谁在请求创建时“获胜”并且还依赖用户监护人不是一个好的监督策略。

于 2013-04-29T14:25:05.203 回答
2

将您的查找更改为:

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

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

于 2013-04-29T10:57:08.023 回答
1

根据您调用的给定代码actorFor来查找不存在的演员。actorOf演员在被调用 之前不存在。

于 2013-04-28T23:10:27.180 回答