Получить ActorRef для ранее порожденного EventSourcedBehavior - PullRequest
0 голосов
/ 10 апреля 2020

Мы используем источник событий с помощью Akka Persistence, расширяя EventSourcedBehavior. Когда мы создаем персистентного субъекта, мы присваиваем ему уникальное имя, используя uuid (то же самое, что мы используем внутри create для построения PersistenceId для разделения сущностей):

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

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

Позже, когда мы хотим отправить дальнейшие команды актеру, мы хотели бы получить 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

Мы не уверены в правильном подходе здесь. Любая помощь будет высоко ценится.

Ответы [ 2 ]

1 голос
/ 14 апреля 2020

Если я правильно понимаю ваш вопрос, вы хотите получить доступ к 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);
0 голосов
/ 15 апреля 2020

Я наконец нашел это в документации. В типизированной системе правильным способом обработки постоянных акторов является использование EntityRef с ClusterSharding, как в примере, связанном ниже: https://doc.akka.io/docs/akka/current/typed/cluster-sharding.html#persistence - пример

...