在创建远程Actor时,Actors是否已序列化?

时间:2017-08-16 18:41:05

标签: akka

我们说我有2个远程节点,A& B,它们在TCP上都是可见的,并且都运行着ActorSystems。

节点A在其类路径中有一个包含Actor Foo的jar。节点B没有。

如果节点A上的ActorSystem告诉节点B在其ActorSystem中远程创建Foo Actor,那会有效吗?将Foo的字节码通过线路发送给B,或者是否必须/期望节点B需要在其中使用Foo?

1 个答案:

答案 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类需要存在于该远程系统上。