2015-08-25 95 views
0

我們有一個用例,我們有如下設置: 主類型的Actor和worker類型的Actor。akka patterns.ask實現細節

主站接收到輸入的工作請求並使用工作人員編排並生成​​結果。

有一個計劃來創建一個名爲client.java的Java類。這將創建一個新的主實例並將工作發送給它。此客戶端使用 - Patterns.ask來獲取將來的指針,並在其後得到結果,直到結果到達。

Patterns.ask(master, initialMessage, t);  
Await.result to get the message 

Patterns.ask的內部文件說將創建一個臨時actor。但是,當我調用並嘗試打印master中的發送者的hashCode時,每次都看起來是同一個actor。

我有以下的憂慮:

  1. 如何Patterns.ask的併發調用管理?它可以在調用後像線程一樣發生,請求獲取將來的指針,但將錯誤的數據放入其中?
  2. 它如何保證未來的指針只填充相關的響應而不與其他人的響應混淆?
    對於例如:FutureX =未來預計X消息
    FutureY =未來預計Y消息
    FutureX能否獲得Y和FutureY獲得X?

回答

0

我還沒有閱讀Patterns.ask內部文檔,但我認爲它使用ActorRef.forward(消息,上下文)以便堅持發送消息。此外,您不應該阻止(Await.result()),而應該使用akka.dispatch.Futures提供的工廠方法來應用回調。您可以到鏈和回收今後的任務(及以上),並得到一個更好的方式應用性能如下所述:

http://doc.akka.io/docs/akka/2.3.12/java/futures.html#Functional_Futures

0

所有參與者在ATLEAST一個或多個線程池運行(您可以配置在Akka的默認application.conf文件中,這些是常規的Java ExecutorService,所以如果您想了解更多信息,請查看ExecutorService源代碼)。 Akka(實際上是演員模型)的美妙之處在於,每個普通演員都是孤立的,沒有類型的,迫使你「要求」一個Actor來改變狀態或者回復一個狀態,而不是你如何使用普通線程來做到這一點。

我假設Akka在內部解決了所有昂貴的鎖定和低級併發問題,當兩個參與者都在不同的線程上運行時,您可以像開發人員不必這樣做。 每個角色都有自己的郵箱(它由一個ConcurrentLinkedQueue支持,它不是阻塞的)。這意味着,無論您發送給演員的消息是否爲「即發即忘」類型或請求狀態(請求),它都會被排入郵箱並按順序依次處理。

+0

對於這個問題的上下文,讓我們假設,我需要阻止。鑑於此,如何處理Patterns.ask的併發執行?如何問是在裏面實現的?這位演員被用來接收最終數據(作爲問答的結果),它的生活是什麼以及它是如何分享的?這個actor如何在正確的Future對象中填充正確的數據? –

+0

這是否意味着使用Patterns.ask創建的actor將擁有所有響應,並可能保持它發送的期貨的hashmap以及響應並更新waiter \ –