Java 为JAX-RS 2.0客户端API设置请求超时

Java 为JAX-RS 2.0客户端API设置请求超时,java,rest,jax-rs,Java,Rest,Jax Rs,我编写了简单的RESTWeb服务客户机类,它使用JAX-RS2.0客户机API发出REST请求。我试图找出如何为每次调用设置请求超时。以下是请求的代码: Client client = ClientBuilder.newBuilder().build(); WebTarget resourceTarget = client.target(restServiceUrl) .path("{regsysID}/{appointmentID}/") .resolveTem

我编写了简单的RESTWeb服务客户机类,它使用JAX-RS2.0客户机API发出REST请求。我试图找出如何为每次调用设置请求超时。以下是请求的代码:

Client client = ClientBuilder.newBuilder().build();
WebTarget resourceTarget = client.target(restServiceUrl)
        .path("{regsysID}/{appointmentID}/")
        .resolveTemplate("regsysID", regSysId)
        .resolveTemplate("appointmentID", apptId);

Invocation invocation = resourceTarget.request(MediaType.APPLICATION_JSON).buildPut(null);
String createSessionJson = invocation.invoke(String.class);

您可以通过首先创建ClientConfig并在创建新客户机时将其作为参数提供来实现这一点

import org.glassfish.jersey.client.ClientProperties;

ClientConfig configuration = new ClientConfig();
configuration.property(ClientProperties.CONNECT_TIMEOUT, 1000);
configuration.property(ClientProperties.READ_TIMEOUT, 1000);
Client client = ClientBuilder.newClient(configuration);

使用Resteasy,这可以通过构建客户机来实现

Client client = new ResteasyClientBuilder()
    .establishConnectionTimeout(2, TimeUnit.SECONDS)
    .socketTimeout(2, TimeUnit.SECONDS)
    .build();

我还没有看到可以通过
ClientBuilder.newClient(configuration configuration)
设置的标准配置属性列表,这些属性是使此可移植所必需的。

首先,您必须添加相关的依赖项(这里是针对WildFly 10.1的):


看一看,问题似乎在3.1.0.Final版本中得到了解决

注意:这是JAX-RS 2.1上提供的一种新方法

这是一篇非常古老的文章,但下面的代码将适用于jersey和resteasy

ClientBuilder clientBuilder = ClientBuilder.newBuilder();
clientBuilder.connectTimeout(10, TimeUnit.SECONDS);
clientBuilder.readTimeout(12, TimeUnit.SECONDS);
Client client = clientBuilder.build();

对于使用旧的JAX-RS 2.0 API和旧的Resteasy实现的用户,可以使用以下方法:

Client client = new ResteasyClientBuilder()             
     .establishConnectionTimeout(3, TimeUnit.SECONDS)
     .socketTimeout(5, TimeUnit.SECONDS).build();

尽管名称不同,socketTimeout代表“读取超时”,因为根据文档,它代表“等待数据的超时”。

如果您使用Jersey 2.x,这是一个简单的解决方案,对我来说很有用

import com.jclient.JClient;

Client c = Client.create();
WebResource webResource = c.resource("requestUrl");
c.setConnectTimeout(yourMins*60*1000);

我认为您假设我使用jersey作为JAXRS的实现。实际上,我正在使用resteasy。但我想知道是否有可能使用纯JAX RS 2.0客户端API以通用的方式实现。@Jeroen您找到纯解决方案了吗?我需要这个。没有通用的JAX-RS 2.0方法吗?@icordoba Try:client.property(org.apache.cxf.message.message.CONNECTION\u TIMEOUT,300000)//5min.property(message.RECEIVE\u TIMEOUT,300000)//5min来自@Custard的回答很好。在找到该线程中的金块之前,搜索了许多站点以寻找解决方案。如果您想保持它的“通用性”(例如“javax.xml.ws.client.connectionTimeout”、“javax.xml.ws.client.receiveTimeout”),只需使用字符串常量而不是cxf类常量即可。谢谢@codyleum。是的,我认为有办法在JAX-RS2.0ClientBuilder类中指定这样的属性会很好!这仅适用于GET请求。对于任何其他方面-Resteasy->Apache.HttpClient integration中存在一个问题,它会删除所有客户端配置,并用默认值替换它们。@MaximKaravaev有什么办法解决您的问题吗?我还需要发表一篇文章。@jlanza我必须向这两个库(HTTPClient和RestEASY)添加依赖项,并重写一个方法,这导致了这个问题。请参阅代码示例的下一条注释。您能否澄清“已解决”是否意味着现在可以处理POST请求?链接线程中的示例使用GET。我可以确认,对于3.1.0.Final和3.0.20.Final.Nevermind,使用最新版本的httpclient,此解决方案是必要的,但没有此解决方案。否决票是没有根据的。即使问题是关于2.0的,答案仍然有用。当时的问题是2.0是最新的。现在,2.1是最新的信息。这实际上是唯一不依赖具体实施的答案。可能其他作者还没有理解API和实现之间的区别。
Client client = new ResteasyClientBuilder()             
     .establishConnectionTimeout(3, TimeUnit.SECONDS)
     .socketTimeout(5, TimeUnit.SECONDS).build();
import com.jclient.JClient;

Client c = Client.create();
WebResource webResource = c.resource("requestUrl");
c.setConnectTimeout(yourMins*60*1000);