2014-02-23 14 views
1

我有一個List(例如一個數據庫查詢的輸出)變量,我用它來創建角色(他們可能很多,而且各不相同)。我用下面的代碼(在TestedActor預起動()),演員限定名是從List變量爲例):從字符串類名創建AKKA actor角色

Class<?> classobject = Class.forName("com.java.anything.actor.MyActor"); //create class from name string 
ActorRef actref = getContext().actorOf(Props.create(classobject), actorname); //creation 

代碼進行了測試:

@Test 
public void testPreStart() throws Exception { 
    final Props props = Props.create(TestedActor.class); 
    final TestActorRef<TestedActor > ref = TestActorRef.create(system, props, "testA"); 
    @SuppressWarnings("unused") 
    final TestedActor actor = ref.underlyingActor(); 
} 

編輯:它是工作正常(與之前的帖子相反,在那裏我看到超時錯誤,結果是一個無關的警報)。

我已經搜索了一些與此問題相關的帖子(例如,建議使用newInstance),但是我仍然感到困惑,因爲這些被提到它作爲一個壞模式被取代。所以,我正在尋找java中的解決方案,從akka的角度來看也是安全的(或者上述模式的確認)。

回答

0

也許如果你會寫我們爲什麼你需要用這種方式創建這些演員,這將有助於找到解決方案。

其實大多數人會告訴你,使用反射不是最好的主意。有時它是唯一的選擇,但你應該避免它。

也許這將是您的解決方案:

由於演員都是很便宜的,你可以創建所有的前期。你有多少人?

現在,查詢可能會返回給演員的路徑,而不是類。選擇actorSelection併發送消息給它。

如果你的演員做長時間運行的工作,你可以使用路由器或者如果你想要一個代理演員,可以根據需要產生其他演員。其他選擇是從單個演員創建期貨。

這實際上取決於具體情況,因爲您可能需要創建多個執行上下文來避免任何參與者(期貨)的匱乏。

+0

這是科學計劃,演員是數學生物進行計算,演員序列可能會被用戶重新排列。我選擇反射作爲一個簡單的XML文件可以以任何新的方式設置一切。不過,你可能是對的,演員必須在之前創建,只有在xml中描述接線。謝謝你指出。 – user1229873

+0

只是一個想法。如果我理解正確,你有一些微積分管道,其中一個結果作爲輸入傳遞給另一個結果。你可能會考慮放棄演員並單獨使用Futures,因爲他們結合得很好。 – almendar

+0

是的,我也會考慮期貨,但是我們在一些計算中投票給演員,因爲我們需要大量的並行。 – user1229873