我创建了一个简单的场景。 以下角色系统:
akka.tcp://TestSystem@127.0.0.1:2560
akka.tcp://TestSystem@127.0.0.1:2570
akka.tcp://TestSystem@127.0.0.1:2580
这个想法是从127.0.0.1:2570创建一个“ SampleActor”,但是使用文档Creating Actors Remotely
中所述的配置将actor创建部署到127.0.0.1:2560。akka {
actor {
deployment {
/sampleActor {
remote = "akka.tcp://TestSystem@127.0.0.1:2560"
}
}
}
}
然后在127.0.0.1:2570:
system.actorOf(Props.create(SampleActor.class), "sampleActor");
现在从127.0.0.1:2580起,我想找到远程部署的actor并发送一条消息。根据文档:Looking up Remote Actors
ActorSelection selection =
system.actorSelection("akka.tcp://TestSystem@127.0.0.1:2560/user/sampleActor");
selection.tell("Pretty slick", ActorRef.noSender());
但是,这不起作用。它无法在127.0.0.1:2560上找到演员。但是如果我更改为:
ActorSelection selection =
system.actorSelection("akka.tcp://TestSystem@127.0.0.1:2570/user/sampleActor");
selection.tell("Pretty slick", ActorRef.noSender());
区别在于,在第一个情况下,我正在寻找部署它的actor,在这种情况下,如文档所述,在127.0.0.1:2560中,而在第二个情况下,我正在寻找actor所在的actor。参与者创建已定义,在这种情况下为127.0.0.1:2570。为什么会发生这种情况?这没有任何意义,如果我正在寻找一个远程演员,那么我应该看看部署它的正确位置吗? 另外,在已部署的actor上打印父级时,我得到:
akka://TestSystem/remote/akka.tcp/TestSystem@127.0.0.1:2570/user
这使它更加混乱,因为它与文档中所述的不一样:The Interplay with Remote Deployment所有这些都使它真正令人困惑,文档很长,并且没有正确解释如何做一些基本的事情正确地。有人可以帮我了解这个问题吗?
答案 0 :(得分:0)
很显然,这就是akka的工作方式,这很令人困惑。最后,您应该始终将消息发送给“部署者”而不是被部署者。 “部署者”将依次将消息发送给“部署者”。与远程部署相关的所有事物都使用相同的原则。