我正在玩akka玩。当一位新领导人出现时,我希望只做一次事情
我会找到类似的东西,换句话说,我正在寻找类似的东西。
class LeaderUpHook {
def onLeaderUp {
log.log("a new leader is up")
}
}
我搜索群集文档,但仍然不怎么做
答案 0 :(得分:6)
您应该能够使用群集事件来解决这个问题。我的代码示例基于文档here的Subscribe to Cluster Events
部分下的文档。简而言之,您基本上创建了一个订阅相关群集事件的角色,以确定领导者是谁以及该领导者何时启动。那个演员可能看起来像这样:
import akka.actor._
import akka.cluster._
class LeaderUpHandler extends Actor{
import ClusterEvent._
val cluster = Cluster(context.system)
cluster.subscribe(self, classOf[MemberUp])
cluster.subscribe(self, classOf[LeaderChanged])
var leader:Option[Address] = None
def receive = {
case state:CurrentClusterState =>
println(s"Got current state: $state")
case MemberUp(member) =>
println(s"member up: $member")
leader.filter(_ == member.address) foreach{ address =>
println("leader is now up...")
}
case LeaderChanged(address) =>
println(s"leader changed: $address")
leader = address
}
}
然后要测试此代码,您可以执行以下操作:
val cfg = """
akka {
actor {
provider = "akka.cluster.ClusterActorRefProvider"
}
remote {
netty.tcp {
hostname = "127.0.0.1"
port = 2552
}
}
cluster {
seed-nodes = [
"akka.tcp://clustertest@127.0.0.1:2552"
]
auto-down = on
}
}
"""
val config = ConfigFactory.parseString(cfg).withFallback(ConfigFactory.load)
val system = ActorSystem("clustertest", config)
system.actorOf(Props[LeaderUpHandler])
当您运行上述代码时,您应该看到领导者已经确定要启动。这是一个过于简单的例子;我只想表明您可以使用群集事件来查找您要查找的内容。