据我了解,对resttemplate交换方法的调用在另一个线程上执行。基本上所有客户端库都在不同的线程上执行。
比方说我的servlet容器是tomcat。当向公开的端点发出请求时,tomcat线程接收到该请求,并且该请求从同一线程上的控制器层到达服务层。在服务层中,我使用resttemplate调用了第三方服务。调用exchange方法时,该操作在内部在不同的线程上运行并获取该操作的结果。
我对此有一个疑问:
resttemplate基本上从哪里从哪个线程池中获取线程以在另一个线程上执行?
我想知道在不同的线程上执行resttemplate是否必须对tomcat线程池做任何事情。
有人能对此有所启发吗?
答案 0 :(得分:0)
当向公开的端点发出请求时,tomcat线程接收到 请求,请求从控制器到达服务层 层在同一线程上。
仅当tomcat和Java应用程序在同一JVM中(例如在嵌入式tomcat中)时,才会发生这种情况。否则,默认情况下,将创建和销毁Java线程而不将其池化。当然,您也可以创建一个Java线程池。
每次通过RestTemplate调用第三方API时,都会创建新的Httpconnection,并在完成后将其关闭。您可以使用HttpComponentsClientHttpRequestFactory
创建RestTemplate自己的连接池,如下所示:
new org.springframework.web.client.RestTemplate(new HttpComponentsClientHttpRequestFactory())