scala-如何订阅akka领导者活动

jil*_*len 2 scala akka playframework-2.0 akka-cluster

我正在玩akka玩.当一位新领导人出现时,我希望只做一次

我会找到类似的东西,换句话说,我正在寻找这样的东西.

class LeaderUpHook {   
    def onLeaderUp {
        log.log("a new leader is up")   
   } 
}
Run Code Online (Sandbox Code Playgroud)

我搜索群集文档,但仍然不怎么做

cmb*_*ter 6

您应该能够使用群集事件来解决这个问题.我将我的代码示例基于此处文档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
  }
}
Run Code Online (Sandbox Code Playgroud)

然后,要测试此代码,您可以执行以下操作:

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])  
Run Code Online (Sandbox Code Playgroud)

当您运行上面的代码时,您应该看到领导者已经确定要启动.这是一个过于简单的例子; 我只是想表明你可以使用群集事件找到你要找的东西.