wen*_*wen 21 java rest multithreading jax-rs
在Java EE7中,JAX-RS Client API提供了一个用于访问任何REST资源的高级API.根据文档,"客户端是管理客户端通信基础设施的重量级对象.初始化以及客户端实例的处理可能是一个相当昂贵的操作.因此建议只构建少量的客户端实例在申请中."
为了避免频繁创建客户端,我将缓存客户端实例并重用它.客户端实例线程是否安全,因为并发线程可以使用它?如果我只创建客户端实例并将其重用于所有请求,是否存在任何性能问题?
Ren*_*nan 14
我不确定,但我认为这是一个特定于实现的决定.
我无法在JAX-RS 2.0规范或Javadoc中找到任何授予javax.ws.rs.client.Client线程安全的东西.但在Resteasy(JAX-RS的实现者)文档中,我发现:
由HttpClient做出并由Resteasy采用的一个默认决策是使用org.apache.http.impl.conn.SingleClientConnManager,它在任何给定时间管理单个套接字,并支持串行进行一个或多个调用的用例从单个线程.对于多线程应用程序,可以用org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager替换SingleClientConnManager:
ClientConnectionManager cm = new ThreadSafeClientConnManager();
HttpClient httpClient = new DefaultHttpClient(cm);
ApacheHttpClient4Engine engine = new ApacheHttpClient4Engine(httpClient);
Run Code Online (Sandbox Code Playgroud)
来源:http://docs.jboss.org/resteasy/docs/3.0.9.Final/userguide/html/RESTEasy_Client_Framework.html#transport_layer
根据这些信息,我猜你的问题的答案可能是"不".
tdd*_*key -11
请注意:虽然这是已接受的答案,但这是特定于实现的并且对于 Jersey 1 客户端来说是正确的。为此,您绝对应该共享一个实例。每个请求创建一个客户端是一个巨大的性能开销
JavaDoc 已经基本回答了您的问题 - 是的,它是线程安全的,您可以而且应该重用它。不重用它可能会出现性能问题,即如果您为每个 HTTP 请求创建一个客户端,那么您的性能将会非常糟糕。
归档时间: |
|
查看次数: |
10355 次 |
最近记录: |