当前位置: 首页 > 知识库问答 >
问题:

在未来的akka java中无限期地等待参与者的响应

袁泰
2023-03-14

我有一段非基于演员的代码,它将一些操作委托给akka演员,我想无限期地等待这个演员的响应,我的意思是,直到这个演员返回一个响应,无论需要多长时间。问题是我不知道如何在未来无限期地等待attern.ask和wait.result方法。

我更喜欢这样的东西:

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对象。。。

任何想法?

干杯

共有2个答案

东郭淇
2023-03-14

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

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

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

或者,或者使用Timeout timeout=Timeout.never

然而,要注意:

具有无限持续时间的超时。永远不会超时。对此要非常小心,因为它可能会导致内存泄漏、线程阻塞,甚至可能不被接收器支持,这将导致异常。(来自Akka API文档)

裘嘉树
2023-03-14

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

您可能需要某种程度的超时(如果合适的话,可能是长超时),然后是必要时重新发送请求的后备情况。这将是处理这种情况的更有力的方法。

 类似资料:
  • 有没有更好的写法呢?由于某种原因,我真的需要这个循环吗?(似乎与有关)

  • 我实际上有三个问题: Selenium WebDriver如何实现此 因为我们不能给无限睡眠的线程一个负值。 有没有更好的方法来实现无限等待? 我们在SeleniumWebDriver文档中看到了这一点

  • 我有一个方法,可以返回期货的 现在我想等待,直到所有的future都成功完成处理,或者future返回其输出的任何任务抛出异常。即使一项任务引发异常,等待另一项任务也没有意义。 简单的方法是 但这里的问题是,例如,如果第四个期货抛出异常,那么我将不必要地等待前三个期货可用。 如何解决这个问题?会以任何方式倒数闩锁帮助吗?我无法使用Future,因为java文档说

  • 问题内容: 我有一种返回List期货的方法 现在,我要等待,直到所有期货都成功完成处理,或者所有由期货返回输出的任务都引发异常。即使一项任务引发异常,也没有必要等待其他期货。 简单的方法是 但是这里的问题是,例如,如果第4个期货抛出异常,那么我将不必要地等待前3个期货可用。 如何解决呢?会以任何方式倒计时闩锁帮助吗?我无法使用Future,isDone因为Java文档说 问题答案: 你可以使用Co

  • 我希望像下面这样的代码可以等待这两种未来,但是没有。 我以为< code>seq.onComplete会在完成自身之前等待它们全部完成,但事实并非如此;它会导致: 在scala.concurrent.Future的源代码中有点难以遵循,我想知道如何实现等待(动态大小的)序列的所有原始未来的并行,或者这里可能有什么问题。 编辑:相关问题:https://worldbuilding.stackexch

  • 下面我有一个简单的代码。所有的期货都应该同时开始应该在Future1和Future3完成后立即运行,但在日志中我看到它会等到Future1、Future2、Future3和Future4全部完成后才运行。为什么要等到第二和第四期呢?