RestTemplate是否同步REST调用?

时间:2018-03-13 12:02:07

标签: java spring spring-rest

我很好奇RestTemplate的一件事。假设我有一个普通的Spring单例组件bean RestService,带有虚拟方法:

@Component
public class RestService {
   private final RestTemplate restTemplate;

   public String performRequest(HttpEntity request, URI url) {
      return restTemplate.exchange(url, HttpMethod.POST, request, String.class);
   }
}

现在线程thread-1与此bean交互并等待休息响应。这是否意味着在thread-1释放restTemplate之前,任何其他急于通过此bean发出请求的线程都会被阻塞?我试图在下面的数字上提供流程。

thread-1 ..request....execution..................response..
thread-N ---------request.......wait..............start execution...

thread-1 ..request....execution..................response..
thread-N ---------request.......execution....response...

换句话说。使用带有多线程调用的restTemplate的此类服务是否可以,并且它的工作方式与图无关。 1或图。 2?

1 个答案:

答案 0 :(得分:1)

RestTemplate是线程安全的(带有免责声明),因此您可以像在代码中一样在多个用户之间共享一个。他们不需要等待对方,事实上他们甚至不知道是否有其他请求同时被执行。

该类的javadoc并未描述它是线程安全的,但代码仅使用局部变量,因此没有共享状态可供竞争。

免责声明:它并非完全没有共享状态,因为您可以配置一些内容,例如setMessageConverters()setErrorHandler()等,但这些只应配置一次。执行网络事务的实际方法是线程安全的。