JAX-RS客户端线程安全吗?

在Java EE7中,JAX-RS Client API提供了一个用于访问任何REST资源的高级API。 根据文档, “客户端是管理客户端通信基础设施的重量级对象。初始化以及客户端实例的处理可能是一项相当昂贵的操作。因此建议仅构建少量客户端实例在申请中。“

为了避免频繁创建客户端,我将缓存客户端实例并重用它。 客户端实例线程是否安全,因为并发线程可以使用它? 如果我只创建客户端实例并将其重用于所有请求,是否存在任何性能问题?

JavaDoc主要回答你的问题 – 是的,它是线程安全的,你可以而且应该重用它。 重用它可能会出现性能问题,即如果您为每个HTTP请求创建一个客户端,那么您的性能将非常糟糕。

我不确定,但我认为这是一个特定于实现的决定。

我无法在JAX-RS 2.0规范或Javadoc中找到任何授予javax.ws.rs.client.Client线程安全的东西。 但在Resteasy(JAX-RS的实现者)文档中,我发现:

由HttpClient做出并由Resteasy采用的一个默认决策是使用org.apache.http.impl.conn.SingleClientConnManager,它在任何给定时间管理单个套接字,并支持串行进行一个或多个调用的用例。从单个线程。 对于multithreading应用程序,可以用org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager替换SingleClientConnManager:

ClientConnectionManager cm = new ThreadSafeClientConnManager(); HttpClient httpClient = new DefaultHttpClient(cm); ApacheHttpClient4Engine engine = new ApacheHttpClient4Engine(httpClient); 

资料来源: http : //docs.jboss.org/resteasy/docs/3.0.9.Final/userguide/html/RESTEasy_Client_Framework.html#transport_layer

根据这些信息,我猜你的问题的答案可能是“不”。