我很好奇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?
答案 0 :(得分:1)
RestTemplate
是线程安全的(带有免责声明),因此您可以像在代码中一样在多个用户之间共享一个。他们不需要等待对方,事实上他们甚至不知道是否有其他请求同时被执行。
该类的javadoc并未描述它是线程安全的,但代码仅使用局部变量,因此没有共享状态可供竞争。
免责声明:它并非完全没有共享状态,因为您可以配置一些内容,例如setMessageConverters()
,setErrorHandler()
等,但这些只应配置一次。执行网络事务的实际方法是线程安全的。