resttemplate.exchange() 如何在不同的线程上执行?

Posted

技术标签:

【中文标题】resttemplate.exchange() 如何在不同的线程上执行?【英文标题】:How does resttemplate.exchange() execute on a different thread? 【发布时间】:2019-08-14 17:19:46 【问题描述】:

据我了解,调用 resttemplate 的 exchange 方法是在不同的线程上执行的。基本上所有客户端库都在不同的线程上执行。

假设我的 servlet 容器是 tomcat。当向暴露的端点发出请求时,tomcat 线程接收请求,并且请求从同一线程上的控制器层到达服务层。在服务层,我使用 resttemplate 调用了 3rd 方服务。当调用exchange方法时,内部操作在不同的线程上运行并获取操作的结果。

我对此有疑问:

resttemplate 基本上从哪个线程池中获取线程以在不同的线程上执行?

我想知道在不同线程上执行 resttemplate 是否必须对 tomcat 线程池做任何事情。

有人能解释一下吗?

【问题讨论】:

【参考方案1】:

当向暴露的端点发出请求时,tomcat 线程会收到 请求和请求从控制器到达服务层 层在同一个线程上。

只有当 tomcat 和 java 应用程序在同一个 JVM 中时才会发生这种情况(比如在嵌入式 tomcat 中)。否则,默认情况下,Java 线程被创建和销毁而不被池化。当然,你也可以创建一个java线程池。

每次通过 RestTemplate 调用第三方 API 时,它都会创建新的 Httpconnection 并在完成后将其关闭。您可以像这样使用HttpComponentsClientHttpRequestFactory 创建 RestTemplate 自己的连接池:

new org.springframework.web.client.RestTemplate(new HttpComponentsClientHttpRequestFactory())

【讨论】:

谢谢,这很有帮助

以上是关于resttemplate.exchange() 如何在不同的线程上执行?的主要内容,如果未能解决你的问题,请参考以下文章

RestTemplate.exchange()不编码'+'?

自定义HttpMessageConverter实现RestTemplate的exchange方法返回自定义格式数据

如何在 Mockito 测试中修复 RestTemplate.exchange 的空值响应?

RestTemplate 记录 POST 数据

Spring Resttemplate 异常处理

模拟 resttemplate 交换总是返回 null