java - JAX-RS 客户端线程是否安全

标签 java multithreading rest jax-rs

在 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);

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

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

关于java - JAX-RS 客户端线程是否安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24700798/

相关文章:

java - 从一个更大的列表中找到 2 个相等和的列表

java - 多个线程向后续进程注入(inject)数据

java - 如何使用 REST 服务上传非 ASCII 文件名的文件?

javascript - 无法从其余服务器获取 Json 响应

java - 阅读使用java发送的电子邮件

java - 使用 thymeleaf 同时迭代两个列表

java - 错误 : java. lang.NoSuchMethodError : org. hibernate.integrator.internal.IntegratorServiceImpl.<init>

c# - .NET Web 服务和 BackgroundWorker 线程

mysql - DataGridView 中的 VB.net BackGroundWorker 跨线程

web-services - 使用 Facebook OAuth 保护 REST API