java - 并行化 REST 调用的最佳方式是什么?
问题描述
我正在处理一些处理多个 REST 调用的 java 代码
call1()
call2()
call3()
...
我想并行化这些调用,但同步执行我的主要代码。我用lamba和并行流制作了一个POC:
List<Runnable> list = new ArrayList();
list.add(() -> {call1()});
list.add(() -> {call2()});
list.add(() -> {call3()});
list.add(...);
list.parallelStream()
.forEach(Runnable::run);
你有其他解决方案吗?我还检查了使用来自 Jersey 客户端的异步调用,但这需要更多的代码更改。
解决方案
您正在寻找的只是异步运行您的调用。您可以使用CompletableFuture
s 提交任务,然后等待他们完成:
list.stream() //you don't really need a parallel stream
.map(CompletableFuture::runAsync)
.collect(Collectors.toList()) //make sure all tasks are submitted
.stream()
.forEach(CompletableFuture::join);
这将提交所有任务(异步运行),然后等待每个任务完成运行。发生这种情况时,该方法将返回。
您可能需要控制异步任务的线程池。这是一个使用 10 线程池的示例:
ExecutorService es = Executors.newFixedThreadPool(10);
list.stream()
.map(r -> CompletableFuture.runAsync(r, es))
...
推荐阅读
- javascript - firebase .once 多次触发
- solidity - 如何解释 Solidity 文档
- c++ - 在opengl中附加对象音调
- python - 根据其他列更改数据框列中的值
- node.js - 电子邮件域上的 Algolia 搜索查询
- javascript - 将字符串转换为数组并垂直显示
- javascript - 离子日期时间错误:无法读取未定义的属性“toISOString”
- python - Django:与排序相关的预取运行多个查询
- pine-script - version4 pinescript 未声明的标识符,iff
- django - 有什么方法可以摆脱这个错误。(1062,“密钥'customer_customerprofile.user_id'的重复条目'2'”)?