Akka verbindet sich nicht automatisch mit Seed-Knoten
-
21-12-2019 - |
Frage
Ich definiere einen Akka-Cluster mit der Play-App.
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
}
}
Dann definiere ich einen Cluster-Listener
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
}
}
Und starte meine App so
val clusterListener = Akka.system.actorOf(Props[ClusterListener], "cluster-listener")
Cluster(Akka.system).subscribe(clusterListener, classOf[ClusterDomainEvent])
Ich starte die App zunächst unter 192.168.1.100, sie verbindet sich.
Dann starte ich die gleiche App
192.16.1.101
Und192.16.1.102
.
Der erste Seed-Knoten erhält jedoch nie ein Join-Event!
Was muss ich tun, damit die anderen Knoten diesem Cluster beitreten können?
Lösung
Ich habe den Grund gefunden.Der Cluster wird in einem Objekt definiert.Und Objekte werden verzögert initialisiert. Rufen Sie also einfach eine beliebige Methode dieses Objekts in der Global.scala auf.Wie dumm von mir!!!
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow