以下群集单例未启动。
commander = system.actorOf(
ClusterSingletonManager.props(Commander.props(this),
terminationMessage = PoisonPill.getInstance,
settings = ClusterSingletonManagerSettings.create(system).withRole("commander")
), name = "Commander")
不会抛出任何错误消息。
日志是:
[INFO] [08/03/2016 11:43:58.656] [ScalaTest-run-running-ClusterSuite] [akka.remote.Remoting]启动远程处理 [INFO] [08/03/2016 11:43:59.007] [ScalaTest-run-running-ClusterSuite] [akka.remote.Remoting] Remoting开始了;收听地址:[akka.tcp://galaxyFarFarAway@127.0.0.1:59592] [INFO] [08/03/2016 11:43:59.035] [ScalaTest-run-running-ClusterSuite] [akka.cluster.Cluster(akka:// galaxyFarFarAway)]群集节点[akka.tcp://galaxyFarFarAway@127.0 .0.1:59592] - 开始...... [INFO] [08/03/2016 11:43:59.218] [ScalaTest-run-running-ClusterSuite] [akka.cluster.Cluster(akka:// galaxyFarFarAway)]群集节点[akka.tcp://galaxyFarFarAway@127.0 .0.1:59592] - 已注册的集群JMX MBean [akka:type = Cluster] [INFO] [08/03/2016 11:43:59.218] [ScalaTest-run-running-ClusterSuite] [akka.cluster.Cluster(akka:// galaxyFarFarAway)]群集节点[akka.tcp://galaxyFarFarAway@127.0 .0.1:59592] - 成功启动 [INFO] [08/03/2016 11:43:59.247] [galaxyFarFarAway-akka.actor.default-dispatcher-2] [akka.cluster.Cluster(akka:// galaxyFarFarAway)]群集节点[akka.tcp:/ /galaxyFarFarAway@127.0.0.1:59592] - 将从MBean中检索度量标准,并且在某些平台上可能不正确。要提高度量准确性,请将“sigar.jar”添加到类路径,并将适当的特定于平台的本机库添加到“java.library.path”。原因:java.lang.ClassNotFoundException:org.hyperic.sigar.Sigar [INFO] [08/03/2016 11:43:59.257] [galaxyFarFarAway-akka.actor.default-dispatcher-2] [akka.cluster.Cluster(akka:// galaxyFarFarAway)]群集节点[akka.tcp:/ /galaxyFarFarAway@127.0.0.1:59592] - 度量标准集已成功启动 [INFO] [08/03/2016 11:43:59.268] [galaxyFarFarAway-akka.actor.default-dispatcher-3] [akka.cluster.Cluster(akka:// galaxyFarFarAway)]群集节点[akka.tcp:/ /galaxyFarFarAway@127.0.0.1:59592] - 未配置种子节点,需要手动群集连接 断开与目标VM的连接,地址:'127.0.0.1:59574',transport:'socket'
配置为:
akka {
actor {
provider = "akka.cluster.ClusterActorRefProvider"
default-dispatcher {
throughput = 10
}
}
cluster {
roles = [commander]
}
remote {
log-remote-lifecycle-events = off
netty.tcp {
hostname = "127.0.0.1"
port = 0
}
}
akka.extensions=["akka.cluster.metrics.ClusterMetricsExtension"]
}
当我调试Commander
类的代码时,构造函数甚至不在任何地方调用。当我省略ClusterSingletonManager
并且仅使用Props
创建它时,它确实有效,将创建Commander
actor。
我感觉到这个问题背后的错误配置。你们对此有何评论?
答案 0 :(得分:2)
您感觉非常正确:您尚未为Akka群集指定种子节点配置。您可以在日志的最后一行看到这一点:
[akka.tcp://galaxyFarFarAway@127.0.0.1:59592] - 未配置种子节点,需要手动群集连接断开与目标VM的连接,地址:'127.0.0.1:59574',传输:'socket'
因为您尚未在配置文件中指定任何种子节点,所以Akka将等待您以编程方式指定种子节点。您可以在配置中指定种子节点,如下所示:
akka.cluster.seed-nodes = [
"akka.tcp://yourClusterSystem@127.0.0.1:2551",
"akka.tcp://yourClusterSystem@127.0.0.1:2552"
]
或者,您可以调用joinSeedNodes方法以编程方式加入群集。在这两种情况下,您都必须指定至少一个可用的种子节点。 actor系统本身也可以充当种子节点。
一旦指定了种子节点并且actor系统已加入群集,Akka功能将根据群集(群集单例,分片等)启动。这就是为什么你可以发射一个普通的演员,而不是单身人士。
有关设置种子节点的详细信息,请参阅Akka cluster documentation。