2014-10-01 84 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