在Akka演员中,你怎么能找到集群的节点? 也就是说,本地节点认为当前可访问的节点。
谢谢, - 丹尼尔
答案 0 :(得分:17)
您实际上无需订阅ClusterDomainEvent
或MemberEvent
。您只需访问群集扩展程序的state
成员,例如
val cluster = akka.cluster.Cluster(context.system)
val members = cluster.state.members.filter(_.status == MemberStatus.Up)
答案 1 :(得分:9)
来自Typesafe Activator tutorial的调整样本:
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
}
}
答案 2 :(得分:4)
一种方法可能是让另一个演员订阅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消息并等待响应。
现在,这种方法假设您可能有许多需要此信息的演员。如果事实证明你只有一个想要这个信息的演员那么只要让那个演员订阅那个事件并用成员更新它的内部状态。