如果我有伴随对象的跟随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")
答案 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
。