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

时间:2019-03-24 06:38:40

标签: multithreading spring-boot spring-mvc threadpool resttemplate

据我了解,对resttemplate交换方法的调用在另一个线程上执行。基本上所有客户端库都在不同的线程上执行。

比方说我的servlet容器是tomcat。当向公开的端点发出请求时,tomcat线程接收到该请求,并且该请求从同一线程上的控制器层到达服务层。在服务层中,我使用resttemplate调用了第三方服务。调用exchange方法时,该操作在内部在不同的线程上运行并获取该操作的结果。

我对此有一个疑问:

resttemplate基本上从哪里从哪个线程池中获取线程以在另一个线程上执行?

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

有人能对此有所启发吗?

1 个答案:

答案 0 :(得分:0)

  

当向公开的端点发出请求时,tomcat线程接收到   请求,请求从控制器到达服务层   层在同一线程上。

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

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

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