当前位置: 首页 > 知识库问答 >
问题:

获取现有或创建新的akka演员

龙浩博
2023-03-14

我正在尝试使用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个答案

桂玉石
2023-03-14

基于给定的代码,您将调用actorFor来查找不存在的参与者。在调用actorOf之前,演员不存在。

宗冷勋
2023-03-14

将查找更改为:

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

如果这是你正在查找的本地演员,你不需要“akka://System”部分。这是假设这个演员已经在代码的其他地方启动了。如果没有,那就没用了。

厍华清
2023-03-14

Get或create只能由指定参与者的父级执行,因为只有该父级可以在参与者不存在的情况下创建该参与者,并且只有父级可以始终如一地创建该参与者(即没有竞争条件)。在一个演员身上你可以做到

// 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),因为这样您就无法确定谁在请求创建时“获胜”,同时依赖用户监护人也不是一个好的监督策略。

 类似资料:
  • 问题内容: 我正在尝试使用ActorFor获取现有的ActorRef,或者如果不存在则创建一个新的。我有以下代码,但它似乎没有按预期工作。.isTerminated()始终为true。 我在这里想念什么?提前致谢。 问题答案: “获取或创建”只能由指定的actor 的 父级 执行,因为只有该父级可以创建actor(如果不存在),并且只有父级才能一致地创建(即没有竞争条件)。在演员中,您可以做 不要

  • 我可以使用创建演员,并使用查看他们。现在我想通过一些获得一个actor,如果它不存在,我想创建它。大概是这样的: 但是这不起作用,因为总是正确的,而且我得到

  • 我想创建可以从文件系统中为资源服务的参与者。理想情况下,[1]我希望每个目录和每个文件都有一个参与者。但是我不想创建整个actor树层次结构,因为我希望尽可能节省内存和资源。 据我所知,只有当它的父级存在时,才能创建一个演员。懒洋洋地创建这些层次结构的最佳方法是什么。是否有一个钩子可以用来捕捉失败并在飞行中创建参与者层次结构,并有效地这样做? 这样,我就可以向参与者发送、、、...消息,从而使ak

  • 我试图使用Akka参与者的层次结构来处理每个用户的状态。有一个父角色拥有所有子角色,并以正确的方式处理get或create(参见a1、a2): 为了回收内存,在空闲一段时间后过期(即计时器触发子actor调用)。 我的问题是,我认为“getOrCreateUserActor”和接收转发消息的子参与者之间存在竞争条件——如果子参与者在该窗口中过期,则转发消息将丢失。 是否有任何方法可以检测此边缘情况

  • 让我们假设一个使用Akka Typed实现的应用程序有一个持久执行元。这个持久执行元作为其操作的一部分创建了瞬态(或非持久)子执行元,每个子执行元都有一个唯一的ID,这些ID是持久状态的一部分。持久执行元还需要一些与其子级通信的方式,但我们不希望持久化子级的,因为它们实际上不是状态的一部分。在恢复时,持久参与者应该基于恢复的状态重新创建它的子级。这听起来并不像是一个很不寻常的用例,我正在试图弄清楚

  • 由于akka是一个构建actor模型的工具包,而actor模型是运行在JVM内部的对象,那么创建后的actor对象的可靠性有多高。考虑到让它崩溃的性质,除非像使用毒丸或JVM关闭一样显式地杀死它,否则JVM中actor对象的可靠性有多高,actor不是自己全部杀死的。