从客户端超时web服务调用
问题描述:
我打电话给一个使用RestEasy客户端的web服务。一个要求是如果运行超过5秒,则中止/超时。我将如何通过RestEasy客户端实现这一目标?我只看到服务器端超时,即Rest Easy web服务会在特定时间内未满足请求时超时。从客户端超时web服务调用
答
RESTEasy客户端通常使用Apache HttpClient来处理网络会话。
你可以用自己的定制超时参数覆盖HttpClient的属性:
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpParams params = httpClient.getParams();
HttpConnectionParams.setConnectionTimeout(params, connectionTimeoutMillis);
HttpConnectionParams.setSoTimeout(params, socketTimeoutMillis);
的第一个参数允许您指定超时建立初始连接,第二个允许您指定的最大时间段中,套接字将等待,而没有数据发送。
您可以使用修改HttpClient的建立你ClientExecutor:
ClientExecutor executor = new ApacheHttpClient4Executor(httpClient);
这又可以被用来建立的ClientRequest对象。或者,如果您为RESTEasy使用Spring配置,则可以将它注入RestClientProxyFactoryBean。
它与绝对5秒超时并不完全相同,但取决于您要完成的工作,调整这两个属性通常会填满账单。
答
如果您正在使用RestEasy的客户端框架和Spring集成(documentation),下面是设置超时值的方式:
<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>
答
卡特页的答案是正确的对于Apache HttpClient版本> = 4.0。
对于早期版本的HttpClient(如3.1)的代码略有不同:
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);
答
如果你喜欢这里的建设者模式是你怎么做:
Client client = new ResteasyClientBuilder()
.establishConnectionTimeout(5, TimeUnit.SECONDS)
.socketTimeout(5, TimeUnit.SECONDS)
.build();
从这里取: http://blog.eisele.net/2014/12/setting-timeout-for-jax-rs-20-resteasy-client.html
我们该如何处理?我的意思是我想记录超时发生。 – Bidisha 2016-07-20 15:54:22