将 ActorRef 获取到先前生成的 EventSourcedBehavior
Get ActorRef to previously spawned EventSourcedBehavior
我们通过扩展 EventSourcedBehavior 将事件源与 Akka Persistence 结合使用。当我们创建持久性 actor 时,我们通过使用 uuid 给它一个唯一的名称(我们在 create
中使用相同的名称来构建 PersistenceId
,用于实体分片):
UUID uuid = UUID.randomUUID();
String name = MyBehavior.nameFor(uuid);
ActorRef<Command> actorRef =
context.spawn(MyBehavior.create(uuid), name);
稍后,当我们想向 actor 发送更多命令时,我们希望从上下文中获取 ActorRef<Command>
,因为 spawn
返回的 actorRef
对象引用将不再在范围内。将命令视为后续 HTTP 请求的结果。
我们不能使用 context.getChild(name)
因为它 returns ActorRef<Void>
.
我们也考虑过 Receptionist 的 actor discovery,但是文档说它不能扩展到任意数量的 actor:
https://doc.akka.io/docs/akka/current/typed/actor-discovery.html#receptionist-scalability
另一方面,类型不支持 ActorSelection,如下 link:
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);
终于在文档上找到了。在类型化系统中,处理持久性 actor 的正确方法是使用 EntityRef
和 ClusterSharding
,如以下链接的示例所示:
https://doc.akka.io/docs/akka/current/typed/cluster-sharding.html#persistence-example
我们通过扩展 EventSourcedBehavior 将事件源与 Akka Persistence 结合使用。当我们创建持久性 actor 时,我们通过使用 uuid 给它一个唯一的名称(我们在 create
中使用相同的名称来构建 PersistenceId
,用于实体分片):
UUID uuid = UUID.randomUUID();
String name = MyBehavior.nameFor(uuid);
ActorRef<Command> actorRef =
context.spawn(MyBehavior.create(uuid), name);
稍后,当我们想向 actor 发送更多命令时,我们希望从上下文中获取 ActorRef<Command>
,因为 spawn
返回的 actorRef
对象引用将不再在范围内。将命令视为后续 HTTP 请求的结果。
我们不能使用 context.getChild(name)
因为它 returns ActorRef<Void>
.
我们也考虑过 Receptionist 的 actor discovery,但是文档说它不能扩展到任意数量的 actor:
https://doc.akka.io/docs/akka/current/typed/actor-discovery.html#receptionist-scalability
另一方面,类型不支持 ActorSelection,如下 link:
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);
终于在文档上找到了。在类型化系统中,处理持久性 actor 的正确方法是使用 EntityRef
和 ClusterSharding
,如以下链接的示例所示:
https://doc.akka.io/docs/akka/current/typed/cluster-sharding.html#persistence-example