如何使用 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,我正在使用 CXFJAX-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 中有两个超时属性,分别称为 ReceiveTimeoutConnectionTimeout,但我还没有设法在我的客户端中找到设置它们的方法。

我尝试过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 秒。 connectTimeoutreadTimeout 不可用。 非常感谢,第一个解决方案非常适合我的情况(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的jax-rs和jax-ws的区别

对 Apache CXF 2.4 (JAX-RS 1.1) 的 CORS 支持

(转)CXF开发RESTFUL的实例练习

使用 Apache CXF 和 OAuth 2.0 保护 JAX-RS

Apache CXF JAX-RS 表示元素未定义