【发布时间】:2017-06-27 11:34:24
【问题描述】:
我正在尝试通过另一个参与者向部署在远程节点上的单例参与者发送消息。
这是等待 memberUp 事件的管理器,然后在该节点上部署 Worker 演员,然后向单例发送消息:
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])
}
}
这是工人:
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}")
}
}
还有application.conf:
manager {
akka {
actor {
provider = "akka.cluster.ClusterActorRefProvider"
}
cluster {
auto-down-unreachable-after = 20s
seed-nodes = [
"akka.tcp://mySys@127.0.0.1:2552"
]
roles.1 = "manager"
}
remote.netty.tcp.port = 2552
}
}
worker {
akka {
cluster {
auto-down-unreachable-after = 20s
seed-nodes = [
"akka.tcp://mySys@127.0.0.1:2552"
]
roles.1 = "worker"
}
remote.netty.tcp.port = 2554
actor {
provider = "akka.cluster.ClusterActorRefProvider"
}
}
}
worker 已初始化(我可以在日志中看到 state change [Start -> Oldest] 消息),但从 manager 发送的消息永远不会到达 worker。当我在远程节点上部署单例时,它曾经工作正常,但现在我希望管理器部署它。
我也尝试将其部署为管理器的子节点(使用上下文而不是 context.system)并将单例路径更改为 user/manager/singleton/worker,但没有成功。
我正在使用 Akka 2.3.11
编辑: sbt 文件:
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"
【问题讨论】:
-
你能发布你的 build.sbt 吗?无需一起搜索所有库,更容易重现。
-
我用 sbt 文件编辑了我的帖子
-
谢谢,ClusterSingleton 的包在 2.5 中发生了变化,我不知道 2.3.11 是哪个
-
您是否有任何理由要将集群单例远程部署到工作人员?
-
不确定是什么问题。如果您问我为什么需要单例而不是普通演员,那是因为在我的实际应用程序中,我有另一个经理,我不想重新启动两个工人(我只想要集群中的一个工人)。如果您问我为什么不从新进程中重新启动actor,那是因为管理器还部署了普通actor,因此最好将逻辑仅放在一个地方-管理器。
标签: scala akka akka-cluster