Актеры Akka, ожидающие полной инициализации вопроса - PullRequest
0 голосов
/ 24 августа 2018

Мое приложение использует актер Supervisor akka, который внутренне инициализировал других актеров (потомков). Однако, поскольку это происходит асинхронно, у меня возникают проблемы при попытке написать тесты с помощью Akka TestKit.

Например, когда я пытаюсь проверить, как система завершается из другой системы, отправив сообщение дочернему актору супервизора, я создаю новую систему акторов, а затем с actorOf супервизора, который получает конфигурацию (используется для создать дочерних актеров внутри супервизора), например:

val anotherSystem: ActorSystem = ActorSystem("anotherSystem")

anotherSystem.actorOf(Props(classOf[Supervisor], new ConfigurationFromStatic(configsAnother), metrics), "AnotherSupervisor")

Затем, если я пытаюсь отправить сообщение дочернему актору в AnotherSupervisor с помощью actorSelection, оно завершается неудачей, поскольку дочерний актер еще не selectable:

anotherSystem.actorSelection("/user/AnotherSupervisor/AnotherManagementReceiver") ! message
expectMsg(Ack)

Сбой, поскольку AnotherManagementReceiver еще не создано.

Использование Thread.sleep(5000) работает, но это просто ужасно.

После поиска возможных решений я протестировал:

anotherSystem.actorSelection("/user/AnotherSupervisor/AnotherManagementReceiver").resolveOne() ! message

Также не работает с существующим сообщением актера.

Также попытался EventFilter, чтобы дочерний актер получил что-то в журнале:

EventFilter.info("Management consumer started", occurrences = 1) intercept {
   anotherSystem.actorOf(Props(classOf[Supervisor], new ConfigurationFromStatic(configsAnother), metrics), "AnotherSupervisor")
}

И это ждет до истечения времени ожидания (я даже вижу сообщение журнала), но я предполагаю, что EventFilter читает только из "основной" системы акторов, созданной TestKit.

Есть идеи или предложения по поводу этого сценария?

1 Ответ

0 голосов
/ 25 августа 2018

Более надежный и последовательный способ - позволить известным актерам представить вас большему количеству актеров: в этом случае руководитель является точкой входа, через которую должно начаться общение.Вы можете либо переслать все сообщения через этого актора, либо добавить протокол поиска для дочерних акторов, где другие могут запросить у супервизора их ActorRefs.

ActorSelection предназначен только для первоначального взаимодействия между удаленными узлами, чтобы получить первыйActorRef.С этого момента гораздо лучше просто использовать сообщения, как описано выше.

...