Есть ли способ для одного узла Akka узнать, был ли перезапущен другой узел Akka?

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

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

1 ответ

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

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

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

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вы наверняка знаете, что nodeB, например, запущен на 10.192.225.18:2559, так что вы можете знать, что Б вверх. Это немного сложное кодирование.

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

cluster {
  roles = ["nodeB"]

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

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

Другие вопросы по тегам