Ich versuche, eine Nachricht an einen Singleton-Akteur zu senden, der auf einem Remote-Knoten durch einen anderen Akteur bereitgestellt wurde.Akka ClusterSingletonProxy zu einem remote bereitgestellten Singleton
Dies ist der Manager, der für ein memberUp Ereignis wartet, setzt dann Worker
Akteur auf diesem Knoten und sendet dann die Singletons eine Nachricht:
object Manager extends App {
val sys = ActorSystem("mySys", ConfigFactory.load("application").getConfig("manager"))
sys.actorOf(Props[Manager], "manager")
}
class Manager extends Actor with ActorLogging {
override def receive: Receive = {
case MemberUp(member) if member.address != Cluster(context.system).selfAddress =>
context.system.actorOf(ClusterSingletonManager.props(
singletonProps = Props(classOf[Worker]),
singletonName = "worker",
terminationMessage = End,
role = Some("worker")).withDeploy(Deploy(scope = RemoteScope(member.address))))
context.actorOf(ClusterSingletonProxy.props(
singletonPath = s"/user/singleton/worker",
role = Some(s"worker")), "worker") ! "hello"
}
override def preStart(): Unit = {
Cluster(context.system).subscribe(self,classOf[MemberUp])
}
}
Dies ist der Arbeiter:
object Worker extends App{
ActorSystem("mySys", ConfigFactory.load("application").getConfig("worker"))
}
class Worker extends Actor with ActorLogging {
override def receive: Receive = {
case msg =>
println(s"GOT MSG : $msg from : ${sender().path.name}")
}
}
Und die application.conf:
manager {
akka {
actor {
provider = "akka.cluster.ClusterActorRefProvider"
}
cluster {
auto-down-unreachable-after = 20s
seed-nodes = [
"akka.tcp://[email protected]:2552"
]
roles.1 = "manager"
}
remote.netty.tcp.port = 2552
}
}
worker {
akka {
cluster {
auto-down-unreachable-after = 20s
seed-nodes = [
"akka.tcp://[email protected]:2552"
]
roles.1 = "worker"
}
remote.netty.tcp.port = 2554
actor {
provider = "akka.cluster.ClusterActorRefProvider"
}
}
}
Der Arbeiter ist initialisiert (und Ich kann in den Protokollen die state change [Start -> Oldest]
Nachricht sehen), aber die Nachricht, die vom Manager gesendet wird, kommt nie zum Arbeiter. Früher funktionierte es gut, als ich das Singleton auf dem Remote-Knoten deployte, aber jetzt möchte ich, dass der Manager es deployed.
Ich habe auch versucht, es als Kind des Managers bereitzustellen (mit Kontext statt Context.System) und änderte den Singleton-Pfad zu user/manager/singleton/worker
, aber es hat nicht funktioniert.
Ich bin mit Akka 2.3.11
Edit: sbt-Datei:
name := "MyProject"
version := "1.0"
scalaVersion := "2.10.5"
libraryDependencies +=
"com.typesafe.akka" %% "akka-actor" % "2.3.11",
"com.typesafe.akka" %% "akka-cluster" % "2.3.11",
"joda-time" % "joda-time" % "2.0",
"com.typesafe.akka" %% "akka-contrib" % "2.3.11"
Könnten Sie bitte Ihre build.sbt posten? Es ist einfacher zu reproduzieren, ohne alle Bibliotheken zusammensuchen zu müssen. – thwiegan
Ich habe meinen Beitrag mit der sbt-Datei bearbeitet –
Danke, das Paket für den ClusterSingleton in 2.5 geändert und ich konnte nicht herausfinden, was es mit 2.3.11 war – thwiegan