如何使用 CXF 为 JAX-RS 客户端设置超时
Posted
技术标签:
【中文标题】如何使用 CXF 为 JAX-RS 客户端设置超时【英文标题】:How to set timeout to JAX-RS client with CXF 【发布时间】:2015-02-04 10:49:26 【问题描述】:我正在开发一个 Rest Client,我正在使用 CXF 和 JAX-RS。
我遇到的问题是我找不到任何方法来覆盖客户端的默认超时值。
一个简单的客户端:
Client client = ClientBuilder.newClient();
WebTarget target = client.target("http://localhost:8080/MyApp");
target = target.path("jsp/Test.jsp");
Response response = target.request().get();
我读到 CXF 中有两个超时属性,分别称为 ReceiveTimeout
和 ConnectionTimeout
,但我还没有设法在我的客户端中找到设置它们的方法。
我尝试过client.property("ReceiveTimeout", 5000);
,但它不起作用。
我已经看到了使用 xml 配置文件来配置客户端的示例,但如果可能的话,我不希望采用该路径。
有什么想法吗?
【问题讨论】:
【参考方案1】:HTTPConduit conduit = WebClient.getConfig(webClient).getHttpConduit();
conduit.getClient().setConnectionTimeout(1000 * 3);
conduit.getClient().setReceiveTimeout(1000 * 3);
【讨论】:
【参考方案2】:您可以在 org.apache.cxf.jaxrs.client.spec.ClientImpl 中找到正确的属性: “http.connection.timeout”和“http.receive.timeout”
所以在构建客户端时只需将它们用作属性:
ClientBuilder.newClient().property("http.receive.timeout", 1000);
借助 JAX-RS 2.1(受 CXF 3.2 支持),您可以在 ClientBuilder 中使用这些标准方法:
connectTimeout(long timeout, TimeUnit unit);
readTimeout(long timeout, TimeUnit unit);
另请参阅:https://github.com/eclipse-ee4j/jaxrs-api/issues/467
【讨论】:
在 TomEE plume 7.0.4 中的属性设置似乎没有效果,超时停留在大约 20 秒。connectTimeout
和 readTimeout
不可用。
非常感谢,第一个解决方案非常适合我的情况(wasLiberty)。【参考方案3】:
你可以试试这样的:
HTTPConduit http = (HTTPConduit) client.getConduit();
HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
httpClientPolicy.setConnectionTimeout(30000);
http.setClient(httpClientPolicy);
见http://cxf.apache.org/javadoc/latest/org/apache/cxf/transports/http/configuration/HTTPClientPolicy.html
【讨论】:
javax.ws.rs.client.Client
中没有 getConduit()
方法。您能否提供有关客户端对象的更多详细信息?
对不起,尝试使用 cxf 的 WebClient cxf.apache.org/javadoc/latest/org/apache/cxf/jaxrs/client/… 此处示例 alvinalexander.com/java/jwarehouse/apache-cxf/systests/jaxrs/…
有没有办法在不使用专有 CXF 类的情况下设置这些参数(即使 CXF 是使用的 JAX-RS 2.0 库)?我使用 WAS Liberty Profile,因此只能访问标准 JAX-RS 2.0 类,没有 org.apache.cxf... 类(并且我想避免使我的代码特定于 CXF,而不是所需的基于字符串的属性客户)
不要忘记httpClientPolicy.setReadTimeout()
。以上是关于如何使用 CXF 为 JAX-RS 客户端设置超时的主要内容,如果未能解决你的问题,请参考以下文章
使用cxf 发布 jax-rs 风格webservice 。并客户端测试。
对 Apache CXF 2.4 (JAX-RS 1.1) 的 CORS 支持