2012-05-24 64 views
0

我將Akka整合到現有軟件中,主要是爲了使事物在不應該同步的地方異步。如何在非演員背景下獲得演員調用的期貨

我一直是做一些數據庫調用,此刻服務,一切是同步的,調用線程只是坐在這裏等待結果......

我的想法是,以取代DAO接口有Future<T>(Akka的)作爲結果而不是實際的結果類型,因此,我的DAO實現實際上是在消息中轉換這些調用並將它們路由到適當的角色(本地和/或遠程)。

現在我有點困惑,當談到如何返回一個Future<T>當我打電話給演員。除了使用Patterns.ask()還有其他方法嗎?這是否是性能最好的解決方案(不使用演員重寫所有內容)?

使用Patterns.ask(),如何在不等待超時的情況下返回錯誤?如果我打電話給我的演員只是告訴我們錯誤,那麼當我想觸發失敗時,它會觸發成功。

編輯

我使用Java。

現在,我想出了一個如下所示的構造,但是,這意味着我的演員必須將tell()例外返回給發件人。

final Future<Object> f = Patterns.ask(..., ..., ...); 
f.flatMap(new Mapper<Object, Future<List<Element>>>() { 
    public Future<List<Element>> apply(Object response) { 
     if (response instanceof SuccessfulResult) { 
      return Futures.successful(response, f.executor()); 
     } else if (response instanceof Throwable) { 
      return Futures.failed((Throwable) response, f.executor()); 
     } else { 
      return Futures.failed(..., f.executor()); 
    } 
} 

回答

0

要區分成功還是失敗,您可以使用scala.Either。因此,答案可能類型看起來是這樣的:

type Result = Future[Either[SQLException, MyDataType]] 
+0

我使用Java,但我想這並不重要......在你的情況,在未來的''會調用'onFailure處()'如果我返回一個'SQLException',我應該簡單地向我的演員拋出'Exception'嗎? –

+0

該文檔是一個很好的起點:http://doc.akka.io/docs/akka/2.0.1/java/untyped-actors.html#Ask__Send-And-Receive-Future –

+0

感謝Viktor指針,之前沒有注意到'失敗'。如果這是在演員環境中完成會發生什麼?調用者將收到'Failure'作爲正常消息,對嗎? –