我们说我有2个远程节点,A& B,它们在TCP上都是可见的,并且都运行着ActorSystems。
节点A在其类路径中有一个包含Actor Foo的jar。节点B没有。
如果节点A上的ActorSystem告诉节点B在其ActorSystem中远程创建Foo Actor,那会有效吗?将Foo的字节码通过线路发送给B,或者是否必须/期望节点B需要在其中使用Foo?
答案 0 :(得分:3)
不,它不会起作用。当节点A上的actor系统告诉节点B上的actor系统创建一个Foo
actor时,节点A不会创建actor并通过线路发送它。相反,节点A向节点B发送Props
Foo
(即创建Foo
actor的方法),节点B创建Foo
的实例( Props
的{{1}}必须是可序列化的。而且,节点B的actor系统的类加载器必须有一个带有Foo
类的jar。来自documentation:
远程创建演员
如果要在Akka远程处理中使用创建功能,则必须按以下方式进一步修改
Foo
文件(仅显示部署部分):
application.conf
上面的配置指示Akka在创建路径为
akka { actor { deployment { /sampleActor { remote = "akka.tcp://sampleActorSystem@127.0.0.1:2553" } } } }
的actor时做出反应,即使用/sampleActor
。此特定actor不会直接实例化,而是会要求远程系统的远程守护进程创建actor,该示例在此示例中对应system.actorOf(Props(...), "sampleActor")
。配置完上述属性后,您将在代码中执行以下操作:
sampleActorSystem@127.0.0.1:2553
actor类SampleActor必须可供使用它的运行时使用,即actor系统的类加载器必须有一个包含该类的JAR。
在同一部分中更进一步:
请注意,远程部署不是远程代码加载,要部署到远程系统上的Actors类需要存在于该远程系统上。