- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
考虑一个代码:
@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*/)
}
在这里我可以看到以下处理顺序:
DispatcherServlet
的请求。DispatcherServlet
确定处理程序并将请求传递给它。process
方法被调用restTemplate.getForEntity
被调用。thenApply
被调用thenCompose
被调用DispatcherServlet
(或其他 Spring 组件)据我了解,1-3
和 7
是在同一个线程池中执行的(我对吗?)。
但是使用什么线程(池)来执行点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/
我是一名优秀的程序员,十分优秀!