如何在其伴随对象中获取没有上下文的actorRef

时间:2014-03-26 15:12:20

标签: scala akka

如果我有伴随对象的跟随Actor(MyActor)。

object MyActor {
}
class MyActor extends Actor{
}

现在我想在一个伴随对象中删除一个方法,如下面的

object MyActor{

def doStuff(id:String){
 (myActor ? Message1(id)).map {

}
}

其中doStuff方法将由不知道演员等的调用者调用。现在doStuff需要" myActor"参考那里。因为对象MyActor没有演员上下文或任何访问方式" myActor"那里的演员?

编辑 MyActor的初始化在应用程序启动时发生,由完全不同的全局对象发生,如下所示。

val system = ActorSystem("MyActorSystem")
//create all first level actors here
system.actorOf(Props[MyActor], "MyActor")

3 个答案:

答案 0 :(得分:1)

听起来你想要将你使用actor作为伴侣对象所暴露的任何服务的实现细节这一事实,但你想集中创建actor(可能是为了给他们一个主管)。一个选项是伴随对象look up the actor

另一种方法是在伴侣对象中隐藏actor的创建。创建actor的全局对象可以,而不是直接创建MyActor,使用ActorSystem参数调用伴随对象上的init方法; MyObject可以保存ActorRef供以后使用。在这种情况下,您必须制作变量@volatile

答案 1 :(得分:1)

如果您真的想在其他地方创建myActor,然后可以在此随播广告中使用它,那么您可以尝试这样的事情:

object MyActor {       

   def doStuff(id:String)(implicit sys:ActorSystem) = {
     (sys.actorSelection("/user/MyActor") ? Message1(id)).map {}
   }
}

通过使上下文成为输入(并且它不必是隐式的,也可以是显式的),不同的代码片段将其传递给/使其以不同的方式可用。例如,在另一个actor中,你已经通过context.system获得了actor系统,但是如果你在actor之外,那么你可能需要让actor系统本身在某种全局对象上可用,然后导入范围。

答案 2 :(得分:0)

问题在于,即使它是在MyActor的伴随对象中定义的,doStuff也无法在没有明确的情况下访问实例化的actor的引用(ActorRef)导入ActorRef myActor

我认为最好按如下方式编写MyActor对象:

object MyActor {
   val myActor = system.actorOf(Props[MyActor], "MyActor")

   def doStuff(id:String) = {
     (myActor ? Message1(id)).map {}
   }
}

Global对象中导入此对象,以便在使用myActor对象后立即创建Global