Timeout webservice call from client side

A RESTEasy client typically uses Apache HttpClient to handle the network conversation.

You can override the HttpClient properties with your own custom timeout parameters:

DefaultHttpClient httpClient = new DefaultHttpClient();
HttpParams params = httpClient.getParams();
HttpConnectionParams.setConnectionTimeout(params, connectionTimeoutMillis);
HttpConnectionParams.setSoTimeout(params, socketTimeoutMillis);

The first param allows you to specify timeout establishing the initial connection and the second allows you to specify the maximum period of time in which a socket will wait while no data is sent.

You can use the modified HttpClient to build your ClientExecutor:

ClientExecutor executor = new ApacheHttpClient4Executor(httpClient);

Which can be used in turn to build a ClientRequest object. Or you can inject it into a RestClientProxyFactoryBean if you are using a Spring configuration for RESTEasy.

It's not exactly the same as an absolute 5 second timeout, but depending on what you are trying to accomplish, tweaking these two properties will usually fill the bill.


If you prefer the builder pattern here is how you do it:

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

taken from here: http://blog.eisele.net/2014/12/setting-timeout-for-jax-rs-20-resteasy-client.html


The answer by Carter Page is correct for Apache HttpClient version >= 4.0.

For earlier versions of HttpClient (e.g. 3.1) the code is slightly different:

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);