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

如何使用CompletableFuture异步发送多个请求并返回成功?

逑俊楚
2023-03-14

假设我有5个请求,我想并行发送所有5个。我可以使用CompletableFuture.allOf()来做到这一点;但是,allOf()只有在所有期货都成功时才返回,即使有一个失败也会失败。我如何从n个成功的期货中得到x,并且在并行发送请求的同时忽略失败的期货?

我正在尝试采取的步骤:

1. Send 5 messages in parallel
2. After 10 second timeout, return all successful messages even if any failed

.

共有1个答案

袁增
2023-03-14

您可以单独捕获异常,并为这些异常场景返回null:

private CompletableFuture<GreetHolder> getGreeting(String lang) {
    return CompletableFuture.supplyAsync( () -> {
        try {
            log.info("Task execution started.");
            Thread.sleep(2000);
            log.info("Task execution stopped.");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return new GreetHolder(getGreet(lang));
    }, executor).exceptionally( ex -> {
        log.error("Something went wrong : ", ex);
        return null;
    });
}

CompletableFuture<Void> allFutures = CompletableFuture.allOf(getGreeting("en"), getGreeting("es"));

有关更多信息,请访问此页面:https://medium.com/@塞纳纳亚克。kalpa/fantastic-completablefuture-allof-and-how-to-handle-errors-27e8a97144a0

 类似资料:
  • 但是,如下所示的调用序列使用相同的TCP连接。 我还没有对此进行调试,但OkHttp似乎迫使我们首先在主线程上发出阻塞HTTP请求,以获得TCP连接上下文,然后与其他线程共享该上下文?或者,我是不是漏掉了什么?

  • 问题内容: 首先,让我解释一下上下文: 我必须创建一个客户端,该客户端将发送许多HTTP请求以下载图像。这些请求必须是异步的,因为一旦完成图像,它将被添加到队列中,然后打印到屏幕上。由于图像可能很大且响应分块,因此我的处理程序必须将其聚合到缓冲区中。 因此,我遵循Netty示例代码(HTTP勺示例)。 目前,我有三个静态映射,用于为每个通道存储通道ID和缓冲区/块布尔值/我的最终对象。 在那之后,

  • 按照这里的Apache HttpAsyncClient示例,HTTPGET请求并不是一次性触发的,而是(大部分)同步触发的。 下图显示了请求的发送顺序(除了一个)。当增加请求数量时,这仍然是正确的。 我使用了另一个库(AsynHttpClient ),请求发送得更快,而且是随机的。 有什么办法可以改进这段代码,让它真正异步执行? 我添加了用于参考的代码。

  • 问题内容: 假设我有某种游戏。我有一个buyItem函数,如下所示: 如果我对该路由进行垃圾邮件处理,直到扣除用户余额(第二次查询),则用户余额仍为正。 我尝试过的 问题是将在第一〜5项要求。因此,这也不起作用。 我们如何处理这种情况?如果重要的话,我正在使用Sails.JS框架。 问题答案: 通过该方法,Sails 1.0现在具有完整的事务支持。例: 更新资料 正如一些评论者所指出的,启用连接池

  • 我正在尝试实现一个通用的REST客户端,如下所示。我有自己的模型将HTTP响应表示为response T。这里T是服务调用的返回类型,它可能只是T或Ts列表。下面的代码不编译,我需要帮助。 最终调用下面的方法,

  • 我正在尝试找到一种异步的方式来立即返回客户端请求的响应。 我所需要的只是记录请求数据,调用新线程请求其他服务器上昂贵的操作(一些后端操作),并且无需等待它们的响应,立即返回200状态响应给客户端。 此时此刻,我正试图用完整的未来来做这件事,但我错过了一些东西。 总之,我得到了立即响应,但veryExpensiveOperations()方法似乎丢失了httpRequest值,这对我来说太糟糕了,因