akka 获取对以前派生EventSourcedBehavior的ActorRef

ymzxtsji  于 2022-11-06  发布在  其他
关注(0)|答案(2)|浏览(130)

我们通过扩展EventSourcedBehavior来使用Akka Persistence的事件源。当我们创建持久化参与者时,我们通过使用uuid给予它一个唯一的名称(我们在create中构建PersistenceId时使用的是相同的uuid,用于实体分片):

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

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

稍后,当我们想向参与者发送更多命令时,我们希望从上下文中获得一个ActorRef<Command>,因为spawn返回的actorRef对象引用不再在作用域中。
我们不能使用context.getChild(name),因为它返回ActorRef<Void>
我们还考虑了Receponist的参与者发现功能,但文档显示它无法扩展到任何数量的参与者:
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
我们不确定这里的方法是否正确。任何帮助都将不胜感激。

ar5n3qh5

ar5n3qh51#

如果我没理解错你的问题的话,你想访问你之前衍生的演员的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);
whlutmcx

whlutmcx2#

在一个类型化的系统中,处理持久化参与者的正确方法是将EntityRefClusterSharding一起使用,如下面链接的示例所示:https://doc.akka.io/docs/akka/current/typed/cluster-sharding.html#persistence-example

相关问题