考虑一项守则:
@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
发布于 2015-09-24 11:17:21
更新
基于更多信息:示例是使用AsyncRestTemplate,它是
Spring用于异步客户端HTTP访问的中心类。..。 注意:默认情况下,AsyncRestTemplate依赖于标准的JDK工具来建立HTTP连接。通过使用接受HttpComponents的构造函数,您可以切换到使用不同的HTTP库,如Apache、Netty和OkHttp。
AsyncRestTemplate使用Spring的SimpleAsyncTaskExecutor (当通过默认构造函数实例化时)
TaskExecutor实现,它为每个任务触发一个新线程,异步执行它。支持通过"concurrencyLimit“bean属性限制并发线程。默认情况下,并发线程的数量是无限的。 注意:此实现不重用线程!考虑一下线程池TaskExecutor实现,特别是用于执行大量短期任务。
后面的部分可能不是最优的,我将AsyncRestTemplate配置为使用您自己的线程池。
https://stackoverflow.com/questions/32759828
复制相似问题