动态加载一个Actor,如果它在那里

Eri*_*luk 1 scala akka scala-reflect

我有以下代码

lazy val restEndpoint = context.actorOf(Props[RestEndpoint], "RestEndpoint")
Run Code Online (Sandbox Code Playgroud)

但是,我想动态加载actor,如果它存在的原因有以下几点:

  1. 它可能不在类路径上,所以我不得不问类加载器它是否在那里.
  2. 即使它在类路径上,我也可能不想因配置原​​因而加载它.
  3. RestEndpoint位于不同的JAR文件中,该文件已经依赖于此JAR文件,因此我不能拥有循环依赖项.

是否有一些'简单'的方式来反思这样做?请不要指出Scala中有关反射的文档,因为那里没有什么容易的.如果有Scala Reflection for Dummies讨论,我会很感激.

一个工作的例子将不胜感激.

Sar*_*ngh 5

反思对于不属于你的事物没有帮助classpath.任何不在类路径中的东西都意味着"Java does not know about the existence of this entity.".

现在,当谈到任何实例化的演员时(无论在哪里......它甚至可以在所有Akka关心的替代宇宙中......),你可以ActorRef通过使用他们的fully qualified地址(路径)来引用它们,嗯......替代宇宙......嗯......简单,问你的替代自我:p)例子 -

val as = ActorSystem( "myActorSystem" )

val refToRemoteActor: ActorSelection = as.actorSelection( "akka.tcp://my-sys@host.example.com:5678/user/service-b" )

// Now You can tell anything to your ActorSelction. But you can not ask them.

refToRemoteActor ! "my-message"
Run Code Online (Sandbox Code Playgroud)

如果你需要ActorRef为你的remote Actor,你需要发送一个消息,例如内置的Identify消息,到演员,并使用sender()从该答复的参考remote Actor.

注意:如果有人在为alternate-universe获取Actors时遇到问题,Akka则尚未提供Alternate-universe功能.但是,你可以实现它,就好像你可以通过"量子隧道......或者它到底是什么"获得LAN电缆.