我知道如果您使用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
。
答案 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