Akka:如何查找集群中的当前节点?
从Akka演员那里,你怎么能找到集群的节点? 也就是说,本地节点认为当前可访问的节点。
谢谢, – 丹尼尔
您实际上不需要订阅ClusterDomainEvent
或MemberEvent
。 您只需访问群集扩展的state
成员,例如,
val cluster = akka.cluster.Cluster(context.system) val members = cluster.state.members.filter(_.status == MemberStatus.Up)
来自Typesafe Activator教程的调整样本:
case object GetNodes class MemberListener extends Actor { val cluster = Cluster(context.system) override def preStart(): Unit = cluster.subscribe(self, classOf[MemberEvent]) override def postStop(): Unit = cluster unsubscribe self var nodes = Set.empty[Address] def receive = { case state: CurrentClusterState => nodes = state.members.collect { case m if m.status == MemberStatus.Up => m.address } case MemberUp(member) => nodes += member.address case MemberRemoved(member, _) => nodes -= member.address case _: MemberEvent ⇒ // ignore case GetNodes => sender ! nodes } }
一种方法可能是让另一个actor订阅ClusterDomainEvent
消息,特别是通过CurrentClusterState
事件查找成员。 这可能看起来像这样:
case object GetMembers class ClusterMembersHolder extends Actor{ var members:Set[Member] = Set() override def preStart = { val clusterSys = Cluster(context.system) clusterSys.subscribe(self, classOf[ClusterDomainEvent]) clusterSys.publishCurrentClusterState //Forces the current state } def receive = { case state: CurrentClusterState => members = state.members case GetMembers => sender ! members } }
这是一个粗略的大纲(可能需要一些调整),但从这里,任何想知道当前成员列表的演员都可以通过这个演员发送GetMembers消息?
并等待回应。
现在,这种方法假设您可能有许多想要此信息的演员。 如果事实certificate你只有一个想要这个信息的演员那么只要让那个演员订阅那个事件并用成员更新它的内部状态。