Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 来自客户端的Web服务调用超时_Java_Rest_Timeout_Resteasy - Fatal编程技术网

Java 来自客户端的Web服务调用超时

Java 来自客户端的Web服务调用超时,java,rest,timeout,resteasy,Java,Rest,Timeout,Resteasy,我正在使用RestEasy客户端调用Web服务。一个要求是,如果调用运行超过5秒,则中止/超时调用。我如何使用RestEasy客户端实现这一点?我只看到服务器端超时,也就是说,如果请求在某个时间内没有完成,Rest Easy Web设备将使请求超时。RESTEasy客户端通常使用Apache HttpClient来处理网络对话 <bean id="httpClient" class="org.apache.http.impl.client.DefaultHttpClient">

我正在使用RestEasy客户端调用Web服务。一个要求是,如果调用运行超过5秒,则中止/超时调用。我如何使用RestEasy客户端实现这一点?我只看到服务器端超时,也就是说,如果请求在某个时间内没有完成,Rest Easy Web设备将使请求超时。

RESTEasy客户端通常使用Apache HttpClient来处理网络对话

<bean id="httpClient" class="org.apache.http.impl.client.DefaultHttpClient">
    <property name="params" ref="httpParams"/>
</bean>

<bean id="httpParams" class="org.apache.http.params.BasicHttpParams"/>

<bean id="httpConnectionParams" class="org.apache.http.params.HttpConnectionParamBean">
    <constructor-arg ref="httpParams"/>
    <property name="connectionTimeout" value="10000"/>
    <property name="soTimeout" value="30000"/>
</bean>
您可以使用自己的自定义超时参数覆盖HttpClient属性:

DefaultHttpClient httpClient = new DefaultHttpClient();
HttpParams params = httpClient.getParams();
HttpConnectionParams.setConnectionTimeout(params, connectionTimeoutMillis);
HttpConnectionParams.setSoTimeout(params, socketTimeoutMillis);
<bean id="httpClient" class="org.apache.http.impl.client.DefaultHttpClient">
    <property name="params" ref="httpParams"/>
</bean>

<bean id="httpParams" class="org.apache.http.params.BasicHttpParams"/>

<bean id="httpConnectionParams" class="org.apache.http.params.HttpConnectionParamBean">
    <constructor-arg ref="httpParams"/>
    <property name="connectionTimeout" value="10000"/>
    <property name="soTimeout" value="30000"/>
</bean>
第一个参数允许您指定建立初始连接的超时时间,第二个参数允许您指定套接字在不发送数据时等待的最长时间

<bean id="httpClient" class="org.apache.http.impl.client.DefaultHttpClient">
    <property name="params" ref="httpParams"/>
</bean>

<bean id="httpParams" class="org.apache.http.params.BasicHttpParams"/>

<bean id="httpConnectionParams" class="org.apache.http.params.HttpConnectionParamBean">
    <constructor-arg ref="httpParams"/>
    <property name="connectionTimeout" value="10000"/>
    <property name="soTimeout" value="30000"/>
</bean>
您可以使用修改后的HttpClient构建客户端执行器:

ClientExecutor executor = new ApacheHttpClient4Executor(httpClient);
<bean id="httpClient" class="org.apache.http.impl.client.DefaultHttpClient">
    <property name="params" ref="httpParams"/>
</bean>

<bean id="httpParams" class="org.apache.http.params.BasicHttpParams"/>

<bean id="httpConnectionParams" class="org.apache.http.params.HttpConnectionParamBean">
    <constructor-arg ref="httpParams"/>
    <property name="connectionTimeout" value="10000"/>
    <property name="soTimeout" value="30000"/>
</bean>
它可以依次用于构建ClientRequest对象。或者,如果您使用的是RESTEasy的Spring配置,则可以将其注入RestClientProxyFactoryBean

<bean id="httpClient" class="org.apache.http.impl.client.DefaultHttpClient">
    <property name="params" ref="httpParams"/>
</bean>

<bean id="httpParams" class="org.apache.http.params.BasicHttpParams"/>

<bean id="httpConnectionParams" class="org.apache.http.params.HttpConnectionParamBean">
    <constructor-arg ref="httpParams"/>
    <property name="connectionTimeout" value="10000"/>
    <property name="soTimeout" value="30000"/>
</bean>

这与绝对5秒超时并不完全相同,但取决于您试图完成的任务,调整这两个属性通常可以满足需要。

如果您使用的是带spring integration()的resteasy client framework,则以下是设置超时值的方法:

<bean id="httpClient" class="org.apache.http.impl.client.DefaultHttpClient">
    <property name="params" ref="httpParams"/>
</bean>

<bean id="httpParams" class="org.apache.http.params.BasicHttpParams"/>

<bean id="httpConnectionParams" class="org.apache.http.params.HttpConnectionParamBean">
    <constructor-arg ref="httpParams"/>
    <property name="connectionTimeout" value="10000"/>
    <property name="soTimeout" value="30000"/>
</bean>

<bean id="httpClient" class="org.apache.http.impl.client.DefaultHttpClient">
    <property name="params" ref="httpParams"/>
</bean>

<bean id="httpParams" class="org.apache.http.params.BasicHttpParams"/>

<bean id="httpConnectionParams" class="org.apache.http.params.HttpConnectionParamBean">
    <constructor-arg ref="httpParams"/>
    <property name="connectionTimeout" value="10000"/>
    <property name="soTimeout" value="30000"/>
</bean>

Carter Page的回答对于Apache HttpClient版本>=4.0是正确的

<bean id="httpClient" class="org.apache.http.impl.client.DefaultHttpClient">
    <property name="params" ref="httpParams"/>
</bean>

<bean id="httpParams" class="org.apache.http.params.BasicHttpParams"/>

<bean id="httpConnectionParams" class="org.apache.http.params.HttpConnectionParamBean">
    <constructor-arg ref="httpParams"/>
    <property name="connectionTimeout" value="10000"/>
    <property name="soTimeout" value="30000"/>
</bean>
对于早期版本的HttpClient(如3.1),代码略有不同:

<bean id="httpClient" class="org.apache.http.impl.client.DefaultHttpClient">
    <property name="params" ref="httpParams"/>
</bean>

<bean id="httpParams" class="org.apache.http.params.BasicHttpParams"/>

<bean id="httpConnectionParams" class="org.apache.http.params.HttpConnectionParamBean">
    <constructor-arg ref="httpParams"/>
    <property name="connectionTimeout" value="10000"/>
    <property name="soTimeout" value="30000"/>
</bean>
HttpClient httpClient = new HttpClient();
HttpConnectionParams params = httpClient.getHttpConnectionManager().getParams();
params.setConnectionTimeout(connectionTimeoutMillis);
params.setSoTimeout(socketTimeoutMillis);

ClientExecutor executor = new ApacheHttpClientExecutor(httpClient);
MyService service = ProxyFactory.create(MyService.class, URL, executor);

如果您喜欢builder模式,以下是您的操作方式:

<bean id="httpClient" class="org.apache.http.impl.client.DefaultHttpClient">
    <property name="params" ref="httpParams"/>
</bean>

<bean id="httpParams" class="org.apache.http.params.BasicHttpParams"/>

<bean id="httpConnectionParams" class="org.apache.http.params.HttpConnectionParamBean">
    <constructor-arg ref="httpParams"/>
    <property name="connectionTimeout" value="10000"/>
    <property name="soTimeout" value="30000"/>
</bean>
 Client client = new ResteasyClientBuilder()
            .establishConnectionTimeout(5, TimeUnit.SECONDS)
            .socketTimeout(5, TimeUnit.SECONDS)
            .build();

从这里开始:

考虑到establishConnectionTimeoutsocketTimeout都不推荐使用

<bean id="httpClient" class="org.apache.http.impl.client.DefaultHttpClient">
    <property name="params" ref="httpParams"/>
</bean>

<bean id="httpParams" class="org.apache.http.params.BasicHttpParams"/>

<bean id="httpConnectionParams" class="org.apache.http.params.HttpConnectionParamBean">
    <constructor-arg ref="httpParams"/>
    <property name="connectionTimeout" value="10000"/>
    <property name="soTimeout" value="30000"/>
</bean>
以下是jboss v7.3的解释:

<bean id="httpClient" class="org.apache.http.impl.client.DefaultHttpClient">
    <property name="params" ref="httpParams"/>
</bean>

<bean id="httpParams" class="org.apache.http.params.BasicHttpParams"/>

<bean id="httpConnectionParams" class="org.apache.http.params.HttpConnectionParamBean">
    <constructor-arg ref="httpParams"/>
    <property name="connectionTimeout" value="10000"/>
    <property name="soTimeout" value="30000"/>
</bean>
以下符合ClientBuilder规范的方法替换了某些不推荐的RESTEasy方法:

<bean id="httpClient" class="org.apache.http.impl.client.DefaultHttpClient">
    <property name="params" ref="httpParams"/>
</bean>

<bean id="httpParams" class="org.apache.http.params.BasicHttpParams"/>

<bean id="httpConnectionParams" class="org.apache.http.params.HttpConnectionParamBean">
    <constructor-arg ref="httpParams"/>
    <property name="connectionTimeout" value="10000"/>
    <property name="soTimeout" value="30000"/>
</bean>
  • connectTimeout方法取代了buildConnectionTimeout方法

    <bean id="httpClient" class="org.apache.http.impl.client.DefaultHttpClient">
        <property name="params" ref="httpParams"/>
    </bean>
    
    <bean id="httpParams" class="org.apache.http.params.BasicHttpParams"/>
    
    <bean id="httpConnectionParams" class="org.apache.http.params.HttpConnectionParamBean">
        <constructor-arg ref="httpParams"/>
        <property name="connectionTimeout" value="10000"/>
        <property name="soTimeout" value="30000"/>
    </bean>
    
    • connectTimeout方法确定客户端在建立新服务器连接时必须等待多长时间
  • readTimeout方法取代了socketTimeout方法

    <bean id="httpClient" class="org.apache.http.impl.client.DefaultHttpClient">
        <property name="params" ref="httpParams"/>
    </bean>
    
    <bean id="httpParams" class="org.apache.http.params.BasicHttpParams"/>
    
    <bean id="httpConnectionParams" class="org.apache.http.params.HttpConnectionParamBean">
        <constructor-arg ref="httpParams"/>
        <property name="connectionTimeout" value="10000"/>
        <property name="soTimeout" value="30000"/>
    </bean>
    
    • readTimeout方法确定客户端必须等待服务器响应的时间
这在我的《RestEASY 3.12.1》中很有效。最终版:

<bean id="httpClient" class="org.apache.http.impl.client.DefaultHttpClient">
    <property name="params" ref="httpParams"/>
</bean>

<bean id="httpParams" class="org.apache.http.params.BasicHttpParams"/>

<bean id="httpConnectionParams" class="org.apache.http.params.HttpConnectionParamBean">
    <constructor-arg ref="httpParams"/>
    <property name="connectionTimeout" value="10000"/>
    <property name="soTimeout" value="30000"/>
</bean>
    private Client clientBuilder() {
        return new ResteasyClientBuilder()
            .connectTimeout(2, TimeUnit.SECONDS)
            .readTimeout(10, TimeUnit.SECONDS)
            .build();
    }

我们如何处理?我的意思是我想记录是否发生超时。目前这两种方法都不推荐使用