質問

PlayアプリでAkkaクラスタを定義します。

Application.conf

akka {
  actor {
    provider = "akka.cluster.ClusterActorRefProvider"
  }
  remote {
    log-remote-lifecycle-events = off
    netty.tcp {
      hostname = "192.168.1.100"
      port = 2552
    }
  }
  cluster {
    seed-nodes = [
      "akka.tcp://application@192.168.1.100:2552",
      "akka.tcp://application@192.168.1.101:2552",
      "akka.tcp://application@192.168.1.102:2552"]
      auto-down-unreachable-after = 10s
  }
}
.

それから私はクラスタリスナー

を定義します
class ClusterListener extends Actor with ActorLogging {
  def receive = {
    case state: CurrentClusterState =>
      log.info("Current members: {}", state.members.mkString(", "))
    case MemberUp(member) =>
      log.info("Member is Up: {}", member.address)
    case UnreachableMember(member) =>
      log.info("Member detected as unreachable: {}", member)
    case MemberRemoved(member, previousStatus) =>
      log.info("Member is Removed: {} after {}",
        member.address, previousStatus)
    case _: ClusterDomainEvent => // ignore
  }
}
.

とこのようなアプリを起動する

val clusterListener = Akka.system.actorOf(Props[ClusterListener], "cluster-listener")
  Cluster(Akka.system).subscribe(clusterListener, classOf[ClusterDomainEvent])
.

私は最初に192.168.1.100でアプリを起動し、結合します。

それから私は192.16.1.101192.16.1.102で同じアプリを起動します。

しかし最初のシードノードは結合イベントを受け取らない!

他のノードにこのクラスターに参加させるにはどうすればいいですか?

役に立ちましたか?

解決

その理由を見つけました。クラスタはオブジェクトに定義されています。そしてオブジェクトは遅延初期化されているので、Global.Scalaでそのオブジェクトのメソッドを呼び出します。愚かな私!!!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top