【问题标题】:Wait for an actor response indefinitely in a future akka java在未来的akka​​ java中无限期地等待演员响应
【发布时间】:2014-11-26 19:12:07
【问题描述】:

我有一段非基于actor的代码,它将一些操作委托给akkaactor,我想无限期地等待这个actor响应,我的意思是,直到这个actor返回一个响应,不管它需要什么时间。问题是我不知道如何使用 Pattern.ask 和 Await.result 方法在 Future 中无限期地等待。

我更喜欢这样的:

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

但这不起作用,因为 Timeout 不接受 Duration 对象作为构造函数参数,它只接受 FiniteDuration 对象...

有什么想法吗?

干杯

【问题讨论】:

    标签: java multithreading scala akka


    【解决方案1】:

    您可能永远不会收到答复,因为无法 100% 保证消息传递。因此,无限期等待不是一个好方法——你很可能会永远等待。

    您可能需要某种程度的超时(如果合适,可能需要较长的超时),然后是一种备用情况,您可以根据需要重新发送请求。这将是处理这种情况的更稳健的方式。

    【讨论】:

    • FiniteDuration 被强制执行是有充分理由的。但正如建议的那样,new TimeOut(Long.MAX_VALUE, TimeUnit.DAYS) 应该给你足够的时间去死几次。
    • 您的超时时间不能超过 292 年,否则您将收到 IllegalArgumentException: requirements failed: Duration is limited to 292 年。我认为您最多只能通过 21474835 秒。
    • @Ravi 虽然它是正确的,但最大值是 21474835 秒,这只是 248 天(不是年)。
    【解决方案2】:

    免责声明:我对 Akka 不是很有经验。

    建议:你不能放弃 Timeout 对象而简单地写

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

    要么这样,要么使用Timeout timeout = Timeout.never

    但要小心:

    具有无限持续时间的超时。永远不会超时。使用极端 小心这一点,因为它可能会导致内存泄漏、线程阻塞或 接收器甚至可能不支持,这将导致 例外。 (来自 Akka API 文档)

    【讨论】:

    • 那是做不到的。你见过akka.pattern.Patterns API 吗?
    • 我用过但还没用过。我的印象是,由于 gracefulStop 专门要求 FiniteDuration,而 ask 只要求 Timeout,因此您可以使用 Timeout.never。我可能弄错了(因此我的免责声明)。
    • Timeout 没有调用 never 的方法或成员。感谢您有兴趣解决我的问题,但您的回答完全错误
    • 这个答案是非常错误的。其中一个函数不存在(Timeout.never),另一个不能在那个地方使用(Duration.Inf)。
    • 抱歉,我引用的是旧版本的 Akka (2.0):doc.akka.io/api/akka/2.0/akka/util/Timeout$.html
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-10
    • 1970-01-01
    • 2019-01-31
    • 1970-01-01
    • 2012-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多