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

时间:2014-07-11 15:01:40

标签: java multithreading rest jax-rs

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

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

2 个答案:

答案 0 :(得分:13)

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

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

  

由HttpClient做出并由Resteasy采用的一个默认决定是   使用org.apache.http.impl.conn.SingleClientConnManager,其中   在任何给定时间管理单个套接字并支持使用   一个或多个调用是从一个单独连续进行的情况   线。对于多线程应用程序,SingleClientConnManager可能是   取而代之   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

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

答案 1 :(得分:-5)

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