可以与非演员的远程演员沟通吗?

时间:2016-05-01 00:45:43

标签: scala akka

我知道如果您使用ask?语法),您可以发送消息并从演员外部接收回复。问题是我不知道当演员是远程时是否可以这样做。 “在演员之外”我指的是普通的非演员代码。非演员可以与远程演员交谈吗?

[]是流程边界,大写意味着它是一个参与者。以前设置是这样的,并且工作正常:

[ a B ]

但是现在我正在尝试制作B遥控器:

[ a ] [ B ]

如果我给[ a ]一个本地演员,我可能会让它工作,但这不是必需的。

a 中,没有ActorContext,只有ActorSystem。以下是我尝试使用的代码(remote B ):

val systemName = "THIS_UNIVERSE"
// other vals: remoteIP, remotePort, remoteActorName - all to do with B
val actorSystem = ActorSystem(systemName)
...
val str = s"akka.tcp://$systemName@$remoteIP:$remotePort/user/$remoteActorName"
actorSystem.actorSelection(str).resolveOne().onComplete {
  ...
} 

正如您所看到的,即使语法没有多大意义:已经存在actorSystem,但在协议中需要使用字符串systemName

是否可以与非演员进行远程演员沟通?我没有找到任何用作参考的例子。

我确实知道 B 正在运行,实际上它已经有另一个能够找到它并与之通信的actor。

出于这个问题的目的,我刚刚建立了一个独立的Scala程序,它创建了一个actor并试图以与上面的代码类似的方式将actorRef变为 B 。但没有快乐:

Actor not found for: ActorSelection[Anchor(akka://THIS_UNIVERSE/deadLetters), Path(/user/MyPLC)]

这个独立程序是否需要加载application.conf?即没有这样的文件,它将无法找到远程演员?

很好 - 独立程序可以在存在src/main/resources/application.conf文件时找到远程actor,以便sbt接收。

回到最初的问题:根据定义,[ a ]在其类路径中不会有application.conf文件,因为它不是actor。但是我会把它放进去,看看它是否有帮助...

这有帮助!在这种情况下,application.conf被放在一个依赖的jar文件的根目录下。

所以问题的答案是你可以从一个非演员那里进行交流,但你仍然需要大多数演员的东西 - 演员jar文件和类路径上的application.conf

1 个答案:

答案 0 :(得分:3)

是的,你应该可以。

如果您能够从本地演员与遥控器[A] [B]进行通信,则让B向A发送消息,然后打印发件人的路径以确保您拥有正确的路径。

关于语法,Button button = new Button(null, imageView); // quadratic grey background button.setBackground(new Background(new BackgroundFill(Color.GREY, CornerRadii.EMPTY, Insets.EMPTY))); // no padding button.setPadding(Insets.EMPTY); 是远程actor系统的名称。您的示例中的systemName是本地actor系统。

你可以让你的非演员代码向本地演员询问远程演员的裁判。例如:

actorSystem

仔细检查路径中的IP地址,确保它与您在远程端的远程配置中使用的IP地址或主机名完全匹配。

这是一个小的可运行的例子。运行此应用程序的两个实例。使用命令行参数val remoteRefFuture = A ? GetRemoteAddress remoteRefFuture.mapTo[ActorRef].foreach { B => B ! Xyz } 启动第一个。然后使用2550开始第二个。

2551