单身集群演员没有启动

时间:2016-08-03 09:52:41

标签: scala akka cluster-computing akka-cluster

以下群集单例未启动。

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。 我感觉到这个问题背后的错误配置。你们对此有何评论?

1 个答案:

答案 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