我有一个akka节点(比如说A)进行引导,一旦完成,它会向其他akka节点(比如说B)发送一条消息,只有这样,Node B才会开始做它的工作。现在的问题是,例如,节点A向节点B发送了引导消息,然后节点B重新启动,因此当节点B出现时,它将处于等待状态(正在等待来自节点A的引导消息)。
节点A是否有办法知道节点B已重新启动并再次发送消息?
答案 0 :(得分:1)
仅供参考的三种解决方案。
1)您可以使用actorSelection
让nodeB每次启动时就向nodeA发送一条消息。然后,nodeA可以知道nodeB的启动。
2)在节点A上设置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)
}
}
NodeA:
system.actorOf(ClusterDomainEventListener.props, ClusterDomainEventListener.name)
然后,每次nodeB启动时,nodeA将获得MemberUp
事件,println输出为:akka.tcp://YourActorSystemName@10.192.225.19:2551
,您肯定知道例如nodeB在10.192.225.18:2559
上运行,因此您可以知道B起来了。这有点困难。
3)如果可以为nodeB akka配置文件设置角色:
cluster {
roles = ["nodeB"]
seed-nodes = [
"akka.tcp://YourActorSystemName@10.192.225.18:2551"
]
}
然后,您可以重用方法2,但是在case MemberUp(m)
中,您可以只使用if (m.hasRole("nodeB"))
来知道B已启动,然后做您想做的下一步。