gpt4 book ai didi

java - 线程池 "mapped"如何在 Spring 中执行?

转载 作者:行者123 更新时间:2023-11-30 03:15:27 25 4
gpt4 key购买 nike

考虑一个代码:

@Autowired
private AsyncRestOperations restTemplate;

@RequestMapping("/abcd")
public CompletableFuture<Result> process(HttpRequest request) {
convertListenableFutureToCompletableFuture(restTemplate.getForEntity("http://...", Result.class))
.thenApply(/*Some logic here*/)
.thenCompose(/*Some logic returns future*/)
}

在这里我可以看到以下处理顺序:

  1. Spring 接收到 DispatcherServlet 的请求。
  2. DispatcherServlet 确定处理程序并将请求传递给它。
  3. process 方法被调用
  4. restTemplate.getForEntity 被调用。
  5. thenApply 被调用
  6. thenCompose 被调用
  7. CompletableFuture“返回”到 DispatcherServlet(或其他 Spring 组件)

据我了解,1-37 是在同一个线程池中执行的(我对吗?)。

但是使用什么线程(池)来执行点4-6

最佳答案

  • 1-3 和 7 在同一线程上执行(对 4 的调用也是如此)

  • 5,6 彼此在同一个线程上执行,该线程是提供 CompletableFuture 结果的同一个线程(在步骤 4 中,并且很可能不是用于提供 CompletableFuture 结果的同一个线程)调用restTemplate)。

  • AsyncRestOperations 是一个接口(interface),因此内部发生的情况将取决于底层实现。

  • 如果您使用的是 NIO Rest 客户端,则 Rest 调用将在 NIO 客户端的内部事件循环池上执行(5 和 6 也可能不是您想要的 - 请参阅 thenApplyAsync,然后是 thenCompose)。

  • 您正在使用异步阻塞 I/O Rest 客户端,通常调用将在其配置的线程池中的线程上执行 - 不幸的是,您正在使用的类的默认行为不是配置线程池但每次都使用一个新线程 - 见下文 - (这里在同一个线程上执行 5 和 6 可能很好,甚至是最佳的)。

更新

基于更多信息:该示例使用 AsyncRestTemplate

Spring's central class for asynchronous client-side HTTP access. ...

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.

AsyncRestTemplate 使用 Spring 的 SimpleAsyncTaskExecutor(当通过默认构造函数实例化时)

TaskExecutor implementation that fires up a new Thread for each task, executing it asynchronously. Supports limiting concurrent threads through the "concurrencyLimit" bean property. By default, the number of concurrent threads is unlimited.

NOTE: This implementation does not reuse threads! Consider a thread-pooling TaskExecutor implementation instead, in particular for executing a large number of short-lived tasks.

后面的部分可能不是最优的,我会配置 AsyncRestTemplate 以使用您自己的线程池。

关于java - 线程池 "mapped"如何在 Spring 中执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32759828/

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