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());
}
}
我使用Java,但我想這並不重要......在你的情況,在未來的''會調用'onFailure處()'如果我返回一個'SQLException',我應該簡單地向我的演員拋出'Exception'嗎? –
該文檔是一個很好的起點:http://doc.akka.io/docs/akka/2.0.1/java/untyped-actors.html#Ask__Send-And-Receive-Future –
感謝Viktor指針,之前沒有注意到'失敗'。如果這是在演員環境中完成會發生什麼?調用者將收到'Failure'作爲正常消息,對嗎? –