如何在CXF中为JAX-RS客户端设置超时时间

16

我正在开发一个Rest客户端,使用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配置文件来配置客户端的示例,但如果可能的话,我不想走这条路。

有任何想法吗?

3个回答

15
HTTPConduit conduit = WebClient.getConfig(webClient).getHttpConduit();
conduit.getClient().setConnectionTimeout(1000 * 3);
conduit.getClient().setReceiveTimeout(1000 * 3);

9
你可以在org.apache.cxf.jaxrs.client.spec.ClientImpl中找到正确的属性:"http.connection.timeout"和"http.receive.timeout"。
因此,在构建客户端时,请将它们作为属性使用。
ClientBuilder.newClient().property("http.receive.timeout", 1000);

从CXF 3.2开始,使用JAX-RS 2.1您可以在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不可用。 - Panu Haaramo
非常感谢,第一个解决方案在我的情况下(wasLiberty)完美运行。 - Chenhai-胡晨海

6

2
javax.ws.rs.client.Client 中没有 getConduit() 方法。您能否提供有关客户端对象的更多详细信息? - NikosDim
1
抱歉,请尝试使用cxf的WebClient https://cxf.apache.org/javadoc/latest/org/apache/cxf/jaxrs/client/WebClient.html 这里有一个示例 http://alvinalexander.com/java/jwarehouse/apache-cxf/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerResourceCreatedSpringProviderTest.java.shtml - isalgueiro
3
在不使用专有的CXF类的情况下,是否有设置这些参数的方法(即使CXF是使用的JAX-RS 2.0库)?我使用的是WAS Liberty配置文件,因此只能访问标准的JAX-RS 2.0类,而没有org.apache.cxf...类(除了客户端所需的基于字符串的属性之外,我想避免将我的代码与CXF相关联)。 - icordoba
3
õ©ı×ĞüÕ┐İ׫░httpClientPolicy.setReadTimeout()ÒÇé - Daniel Marcotte

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接