我们通过扩展EventSourcedBehavior将事件源与Akka Persistence结合使用。当我们创建持久角色时,我们通过使用uuid(在create内部用于构建PersistenceId,用于实体分片)来为其赋予唯一的名称:

UUID uuid = UUID.randomUUID();
String name = MyBehavior.nameFor(uuid);

ActorRef<Command> actorRef =
    context.spawn(MyBehavior.create(uuid), name);


稍后,当我们想向actor发送更多命令时,我们想从上下文中获取一个ActorRef<Command>,因为actorRef返回的spawn对象引用不再在范围内。考虑作为后续HTTP请求的结果的命令。

我们不能使用context.getChild(name),因为它会返回ActorRef<Void>

我们还考虑过与Receptionist合作的演员发现,但是文档说它不能扩展到任何数量的演员:

https://doc.akka.io/docs/akka/current/typed/actor-discovery.html#receptionist-scalability

另一方面,根据以下链接,类型中不支持ActorSelection:

https://doc.akka.io/docs/akka/current/typed/from-classic.html#actorselection

我们不确定正确的方法在这里。任何帮助将非常感激。

最佳答案

如果我正确理解了您的问题,则希望访问以前生成的actor的ActorRef。这是我通常要做的。

private final Map<String, ActorRef<Command> instanceIdToActor = new HashMap<>();

private ActorRef<Command> getActorRef(String instanceId) {
  ActorRef<Command> instanceActor = instanceIdToActor.get(instanceId);
  if (instanceActor == null) {
    instanceActor = getContext().spawn(MyBehavior.create(), instanceId);
    instanceIdToActor.put(instanceId, instanceActor);
  }

  return instanceActor;
}


每当演员死亡时,您还必须删除引用。

instanceIdToActor.remove(instanceId);

09-26 21:25