我们通过扩展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);