在Java EE7中,JAX-RS Client API提供了一个用于访问任何REST资源的高级API。根据文档,“客户端是管理客户端通信基础设施的重量级对象。初始化以及客户端实例的处理可能是一个相当昂贵的操作。因此建议只构建一小部分。应用程序中的客户端实例。“
为了避免经常创建客户端,我将缓存客户端实例并重用它。客户端实例线程是否安全,因为并发线程可以使用它? 如果我只创建客户端实例并将其重用于所有请求,是否存在任何性能问题?
答案 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);
根据这些信息,我猜你问题的答案可能是“不”。
答案 1 :(得分:-5)
JavaDoc主要回答你的问题 - 是的,它是线程安全的,你可以而且应该重用它。 不可能会出现性能问题,即如果您为每个HTTP请求创建一个客户端,那么您的性能就会非常糟糕。