Есть ли способ для одного узла 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"))
знать, что В, и делать следующие вещи, которые вы хотите.