我正在尝试使用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");
我错过了什么?提前谢谢。
基于给定的代码,您将调用actorFor
来查找不存在的参与者。在调用actorOf
之前,演员不存在。
将查找更改为:
system.actorFor("/user/" + name)
如果这是你正在查找的本地演员,你不需要“akka://System”部分。这是假设这个演员已经在代码的其他地方启动了。如果没有,那就没用了。
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不是自己全部杀死的。