在 Java EE7 中,JAX-RS 客户端 API 提供了用于访问任何 REST 资源的高级 API。根据文档,“客户端是管理客户端通信基础设施的重量级对象。初始化和处置客户端实例可能是一项相当昂贵的操作。因此建议只构建少量应用程序中的客户端实例数。"
为了避免频繁创建客户端,我将缓存客户端实例并重用它。客户端实例线程是否安全,因为它可以被并发线程使用? 如果我只创建客户端实例并将其重用于所有请求,是否存在任何性能问题?
最佳答案
我不确定,但我认为这是一个特定于实现的决定。
我在 JAX-RS 2.0 规范和 Javadoc 中都找不到任何授予 javax.ws.rs.client.Client 是线程安全的内容。但在 Resteasy(JAX-RS 的实现者)文档中,我发现:
One default decision made by HttpClient and adopted by Resteasy is the use of org.apache.http.impl.conn.SingleClientConnManager, which manages a single socket at any given time and which supports the use case in which one or more invocations are made serially from a single thread. For multithreaded applications, SingleClientConnManager may be replaced by org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager:
ClientConnectionManager cm = new ThreadSafeClientConnManager();
HttpClient httpClient = new DefaultHttpClient(cm);
ApacheHttpClient4Engine engine = new ApacheHttpClient4Engine(httpClient);
根据这些信息,我猜您的问题的答案很可能是“否”。
关于java - JAX-RS 客户端线程是否安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24700798/