有没有办法让一个Akka节点知道另一个Akka节点是否重新启动

时间:2018-07-05 05:33:24

标签: akka akka-cluster

我有一个akka节点(比如说A)进行引导,一旦完成,它会向其他akka节点(比如说B)发送一条消息,只有这样,Node B才会开始做它的工作。现在的问题是,例如,节点A向节点B发送了引导消息,然后节点B重新启动,因此当节点B出现时,它将处于等待状态(正在等待来自节点A的引导消息)。

节点A是否有办法知道节点B已重新启动并再次发送消息?

1 个答案:

答案 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已启动,然后做您想做的下一步。