Java 来自客户端的Web服务调用超时
我正在使用RestEasy客户端调用Web服务。一个要求是,如果调用运行超过5秒,则中止/超时调用。我如何使用RestEasy客户端实现这一点?我只看到服务器端超时,也就是说,如果请求在某个时间内没有完成,Rest Easy Web设备将使请求超时。RESTEasy客户端通常使用Apache HttpClient来处理网络对话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">
<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();
从这里开始:考虑到establishConnectionTimeout和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>
以下是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方法确定客户端必须等待服务器响应的时间
<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();
}
我们如何处理?我的意思是我想记录是否发生超时。目前这两种方法都不推荐使用