2014-10-01 68 views
1

我有一個非基於演員的代碼片段,它將一些操作委託給一個akka演員,我想無限期地等待這個演員的響應,我的意思是,直到這個演員無論何時都會返回響應。問題是我不知道如何使用Pattern.ask和Await.result方法在Future中無限期地等待。等待演員迴應無限期在未來akka java

我想是這樣的:

Timeout timeout = new Timeout(Duration.inf()); 
Future<Object> future = Patterns.ask(actor, msg, timeout); 
String result = (String) Await.result(future, timeout.duration()); 

但這不起作用,因爲超時不接受持續時間對象作爲構造函數的參數,它僅接受FiniteDuration objetcs ...

任何想法?

乾杯

回答

6

您可能永遠不會得到答案,因爲消息傳遞是不是100%的保證。因此,無限期地等待並不是一個好方法 - 你最終可能會永遠等待。

您可能想要某種程度的超時(如果適合,也許是很長的一種程度),然後是根據需要重新發送請求的回退情況。這將是處理這種情況的更可靠方法。

+0

FiniteDuration被強制執行,原因很充分。但是正如所建議的那樣,「新的TimeOut(Long.MAX_VALUE,TimeUnit.DAYS)」應該會讓你有足夠的時間去死數次。 – 2014-10-01 21:27:19

+0

您無法超過292年的超時時間,否則您將收到IllegalArgumentException:需求失敗:持續時間限制爲292年。我想你最多隻能通過21474835秒。 – Ravi 2016-06-11 18:37:57

+0

@Ravi雖然它是正確的,最大值是21474835秒這只是248天(不是幾年)。 – kap 2017-08-24 09:26:37

-1

聲明:我對Akka並不是很有經驗。

建議:你不能放棄超時對象和簡單的寫

Future<Object> future = Patterns.ask(actor, msg); 
Await.result(f, Duration.Inf); 

要麼,或使用Timeout timeout = Timeout.never

小心,但是:

與無限長的超時。永遠不會超時。使用極端 ,因爲它可能導致內存泄漏,線程被阻塞,或者接收器甚至可能不支持 ,這會導致 異常。 (來自Akka API文檔)

+0

這是無法完成的。 你見過[akka.pattern.Patterns API](http://doc.akka.io/api/akka/2.3.6/index.html#akka.pattern.Patterns$)嗎? – cs4r 2014-10-01 21:01:18

+0

我有但尚未使用它。我的印象是,由於gracefulStop特別要求FiniteDuration,而只詢問Timeout,所以您可以使用Timeout.never。我可能會誤解(因此我的聲明)。 – Sycomor 2014-10-01 21:19:45

+0

Timeout沒有一個方法或成員稱爲never。謝謝你對解決我的麻煩感興趣,但你的回答是完全錯誤的 – cs4r 2014-10-01 22:09:58