【问题标题】:How to set timeout to JAX-RS client with CXF如何使用 CXF 为 JAX-RS 客户端设置超时
【发布时间】: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 配置文件来配置客户端的示例,但如果可能的话,我不希望采用该路径。

有什么想法吗?

【问题讨论】:

    标签: java web-services rest cxf httpclient


    【解决方案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 类的情况下设置这些参数(即使 CXF 是使用的 JAX-RS 2.0 库)?我使用 WAS Liberty Profile,因此只能访问标准 JAX-RS 2.0 类,没有 org.apache.cxf... 类(并且我想避免使我的代码特定于 CXF,而不是所需的基于字符串的属性客户)
      • 不要忘记httpClientPolicy.setReadTimeout()
      猜你喜欢
      • 1970-01-01
      • 2015-01-03
      • 1970-01-01
      • 1970-01-01
      • 2019-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多