如何使用CXF为JAX-RS客户端设置超时

Nik*_*Dim 10 java rest web-services cxf httpclient

我正在使用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();
Run Code Online (Sandbox Code Playgroud)

我已经读过CXF中有两个超时属性被调用ReceiveTimeout,ConnectionTimeout但我还没有找到一种方法在我的客户端中设置它们.

我试过client.property("ReceiveTimeout", 5000);但它不起作用.

我已经看到了使用xml配置文件配置客户端的示例,但如果可能,我不想采用该路径.

有任何想法吗?

小智 12

HTTPConduit conduit = WebClient.getConfig(webClient).getHttpConduit();
conduit.getClient().setConnectionTimeout(1000 * 3);
conduit.getClient().setReceiveTimeout(1000 * 3);
Run Code Online (Sandbox Code Playgroud)


Den*_*rst 8

您可以在org.apache.cxf.jaxrs.client.spec.ClientImpl中找到正确的属性:"http.connection.timeout"和"http.receive.timeout"

所以在构建客户端时只需将它们用作属性:

ClientBuilder.newClient().property("http.receive.timeout", 1000);
Run Code Online (Sandbox Code Playgroud)

使用JAX-RS 2.1(从CXF 3.2支持),您可以在ClientBuilder中使用这些标准方法:

connectTimeout(long timeout, TimeUnit unit);
readTimeout(long timeout, TimeUnit unit);
Run Code Online (Sandbox Code Playgroud)

另见:https://github.com/jax-rs/api/issues/467


isa*_*iro 5

你可以尝试这样的事情:

HTTPConduit http = (HTTPConduit) client.getConduit();
HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
httpClientPolicy.setConnectionTimeout(30000);
http.setClient(httpClientPolicy);
Run Code Online (Sandbox Code Playgroud)

http://cxf.apache.org/javadoc/latest/org/apache/cxf/transports/http/configuration/HTTPClientPolicy.html

  • 有没有办法在不使用专有 CXF 类的情况下设置这些参数(即使 CXF 是使用的 JAX-RS 2.0 库)?我使用 WAS Liberty Profile,所以只能访问标准的 JAX-RS 2.0 类,没有 org.apache.cxf... 类(我想避免使我的代码特定于 CXF,除了需要客户) (3认同)
  • 不要忘记```httpClientPolicy.setReadTimeout()```。 (3认同)
  • `javax.ws.rs.client.Client` 中没有 `getConduit()` 方法。您能否提供有关客户端对象的更多详细信息? (2认同)