gpt4 book ai didi

java - 使用 Resttemplate 的多个异步 HTTP 请求

转载 作者:行者123 更新时间:2023-11-30 06:41:49 27 4
gpt4 key购买 nike

我有一个使用 springs RestTemplate 调用多个 url 的服务。

为了提高性能,我想并行执行这些请求。我可以使用的两个选项是:

  • 利用 fork-join 公共(public)池的 java 8 并行流
  • 使用隔离线程池完成 future

只是想知道使用并行流和阻塞 I/O 调用是否是最佳实践?

最佳答案

ForkJoinPool 不是进行 IO 工作的理想选择,因为您不会获得其工作窃取属性的任何好处。如果您计划使用 commonPool 并且您的应用的其他部分也这样做了,您可能会干扰它们。专用线程池,例如 ExecutorService,可能是这两者中更好的解决方案。

我想推荐一些更好的。与其自己编写所有异步包装代码,不如考虑使用 Spring 的 AsyncRestTemplate .它包含在 Spring Web 库中,其 API 几乎与 RestTemplate 相同。

Spring's central class for asynchronous client-side HTTP access. Exposes similar methods as RestTemplate, but returns ListenableFuture wrappers as opposed to concrete results.

[...]

Note: by default AsyncRestTemplate relies on standard JDK facilities to establish HTTP connections. You can switch to use a different HTTP library such as Apache HttpComponents, Netty, and OkHttp by using a constructor accepting an AsyncClientHttpRequestFactory.

ListenableFuture实例可以通过 ListenableFuture::completable() 轻松转换为 CompletableFuture 实例.

如 Javadoc 中所述,您可以通过指定 AsyncClientHttpRequestFactory 来控制要使用的异步机制。对于列出的每个库,都有许多内置实现。在内部,其中一些库可能会执行您的建议并在专用线程池上运行阻塞 IO。其他的,比如 Netty(如果没记错的话),使用非阻塞 IO 来运行连接。您可能会从中受益。

然后由您决定如何减少结果。使用 CompletableFuture,您可以访问 anyOfallOf 帮助程序以及任何组合实例方法。

例如,

URI exampleURI = URI.create("https://www.stackoverflow.com");

AsyncRestTemplate template = new AsyncRestTemplate/* specific request factory*/();
var future1 = template.exchange(exampleURI, HttpMethod.GET, null, String.class).completable();
var future2 = template.exchange(exampleURI, HttpMethod.GET, null, String.class).completable();
var future3 = template.exchange(exampleURI, HttpMethod.GET, null, String.class).completable();

CompletableFuture.allOf(future1, future2, future3).thenRun(() -> {
// you're done
});

AsyncRestTemplate 已被弃用,取而代之的是 Spring Web Flux' WebClient .这个 API 有很大的不同,所以我不会深入研究它(除了说它确实能让你得到一个 CompletableFuture )。

关于java - 使用 Resttemplate 的多个异步 HTTP 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54639538/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com