есть ли способ для одного узла Akka узнать, был ли перезапущен другой узел Akka? - PullRequest
0 голосов
/ 05 июля 2018

У меня есть узел akka (скажем, A), который выполняет начальную загрузку и после этого отправляет сообщение другому узлу akka (скажем, B), только тогда узел B начнет выполнять свою работу. Теперь проблема, скажем, в том, что Узел A отправил сообщение начальной загрузки на Узел B, а затем Узел B был перезапущен, поэтому, когда Узел B подошел, он будет в состоянии ожидания (ожидание сообщения начальной загрузки от Узла A).

Есть ли способ, чтобы Узел A узнал, что Узел B был перезапущен и снова отправляет сообщение?

1 Ответ

0 голосов
/ 05 июля 2018

Три решения к вашему сведению.

1) Вы можете позволить nodeB отправлять одно сообщение на nodeA каждый раз, когда он запускается, используя actorSelection. Тогда узел A может знать начало узла B.

2) Установите event listener на узле A.

object ClusterDomainEventListener {
  def props = Props[ClusterDomainEventListener]
  val name = "clusterDomainEventListener"
}

class ClusterDomainEventListener extends Actor {
  Cluster(context.system).subscribe(self, classOf[ClusterDomainEvent])

  def receive = {
    case MemberUp(m) =>
      println(m.address)
  }
}

узел А:

system.actorOf(ClusterDomainEventListener.props, ClusterDomainEventListener.name)

Затем, каждый раз, когда запускается узел B, узел A будет получать событие MemberUp, вывод println будет: akka.tcp://YourActorSystemName@10.192.225.19:2551, вы наверняка знаете, что узел B, например, работает на 10.192.225.18:2559, поэтому вы можете знать, что B работает. Это немного сложное кодирование.

3) Если вы можете установить роль для файла конфигурации akka nodeB:

cluster {
  roles = ["nodeB"]

  seed-nodes = [
    "akka.tcp://YourActorSystemName@10.192.225.18:2551"
  ]
}

тогда вы можете повторно использовать метод 2, но в case MemberUp(m) вы можете просто использовать if (m.hasRole("nodeB")), чтобы знать, что В работает, и делать следующие вещи, которые вы хотите.

...