2014-03-26 61 views
0

如果我有跟隨伴侶對象的Actor(MyActor)。如何獲取沒有上下文的actorRef伴隨對象

object MyActor { 
} 
class MyActor extends Actor{ 
} 

現在我想delcare的方法在同伴的物體,像下面

object MyActor{ 

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

} 
} 

其中doStuff方法將它沒有演員等等。現在doStuff需要「myActor」的知識呼叫者被稱爲在那裏參考。因爲對象MyActor沒有actor上下文或任何有什麼辦法來訪問裏面的「myActor」actor?

編輯 MyActor的初始化發生在應用程序啓動時,由一個完全不同的全局對象,如下所示。

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

我不太明白你想要什麼,myActor應該是一個獨特的ActorRef?或者當你實例化一個新的ActorRef時,你需要myActor來引用它? – Peter

+0

@Peter:我用一些更詳細的問題來編輯問題,以瞭解MyActor的初始化位置等。讓我知道這是否回答您的問題? – user2066049

回答

1

這聽起來像你要正確對待,你使用的是演員作爲任何服務的同伴對象公開的實現細節的事實,但要集中演員的創作(大概是爲了給他們一個主管)。一個選項是對於look up the actor的伴侶對象。

另一種方法是創建隱藏在伴侶對象中的actor。創建參與者的全局對象可以(而不是直接創建MyActor)使用ActorSystem參數在協同對象上調用init方法; MyObject可以保存ActorRef供以後使用。在這種情況下,您必須創建變量@volatile

+0

- 我正在探索選項1,因爲選項2對我來說聽起來不像一個乾淨的方法。對於選項1,我也需要從創建actor系統的Global對象訪問「system」(或「context」,無論我們稱之爲「context」)。所以讓我們說不知何故我可以在「MyActor」對象中訪問它,然後我做context.actorSelection(「/ user/myActor」)? – user2066049

+0

這個回答看起來很合理。這對我來說也是一種反模式,讓所有這些全球單身人士都需要了解對方。 –

0

的事情是,即使它在MyActor同伴對象定義,doStuff不明確地導入ActorRefmyActor訪問引用(ActorRef)來實例化的演員。

我認爲這將是更好的寫MyActor對象如下:

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

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

導入該對象在你Global對象,這樣的myActor建立將盡快與Global對象用於完成。

+1

我認爲OP的部分問題是獲取ActorRefFactory(ActorSystem或ActorContext)以產生/查找actor。在你的例子中,'system'從哪裏來? – cmbaxter

+0

從一個全局對象將被導入的地方存儲系統,例如訪問Redis ... – Peter

+0

我在哪裏可以從MyActor對象中獲取「系統」(或「conetxt」,無論我們稱之爲)? val system = ActorSystem(「MyActorSystem」)在全局對象中完成。 – user2066049

1

如果你真的想在其他地方創建myActor,然後可以在這個伴侶使用它,那麼你可以嘗試這樣的事:

object MyActor {  

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

通過使上下文的輸入(和它doesn」不得不是一個隱含的,也可以是明確的)不同的代碼片段將其傳入/以不同的方式提供。例如,在另一個演員中,您已經通過context.system獲得了演員系統,但是如果您不在演員之外,那麼您可能需要使演員系統本身在某種全局對象上可用,然後導入到範圍中。