Handle Connection and Read Timeouts for RestClient calls in android
Asked Answered
B

1

5

I have a RestService interface with many rest calls which I am using throughout my application.

I am setting timeouts for handling connection and read-timeouts

ClientHttpRequestFactory httpFactory = myRestService.getRestTemplate().getRequestFactory();
    if(httpFactory!=null)
    {
        if(httpFactory instanceof SimpleClientHttpRequestFactory)
        {
            ((SimpleClientHttpRequestFactory)httpFactory).setConnectTimeout(10*1000);
            ((SimpleClientHttpRequestFactory)httpFactory).setReadTimeout(30*1000);
        }
        else if(httpFactory instanceof HttpComponentsClientHttpRequestFactory)
        {
            ((HttpComponentsClientHttpRequestFactory)httpFactory).setConnectTimeout(10*1000);
            ((HttpComponentsClientHttpRequestFactory)httpFactory).setReadTimeout(30*1000);
        }
    }

But I am stuck with handling the timeout situation. I thought of using this method but it is not coming into this loop when rest call fails.

myRestService.getRestTemplate().setErrorHandler(new ResponseErrorHandler() 
    {
        @Override
        public boolean hasError(ClientHttpResponse paramClientHttpResponse) throws IOException 
        {
            Log.e(TAG, paramClientHttpResponse==null?"Null response" : ("Has Error : " + paramClientHttpResponse.getStatusText()+" , status code : "+paramClientHttpResponse.getStatusCode()));

            return false;
        }
        @Override
        public void handleError(ClientHttpResponse paramClientHttpResponse) throws IOException 
        {
            Log.e(TAG, paramClientHttpResponse==null?"Null response":("Handle Error : " + paramClientHttpResponse.getStatusText()+" , status code : "+paramClientHttpResponse.getStatusCode()));
        }
    });

Can anybody help me with this..!?

Bulger answered 14/5, 2013 at 12:15 Comment(0)
S
9

Timeout, bad gateway, host not found and other socket exceptions can not be covered by ErrorHandlers. The target of ErrorHandlers is to look for the errors in an existing Response as stated in the ResponseErrorHandler's method signature.

All socket exceptions throw RestClientException and must be caught for every RestTemplate operation such as getForObject() in try...catch block.

try {
    repr = myRestService.getRestTemplate().getForObject(url, responseType, vars);
} catch (RestClientException e) {
    //Further exception processing, forming negative response should be here
}

Check out reference.

Hope, that helps.

Shirtmaker answered 22/5, 2013 at 8:57 Comment(2)
Thanks @alexei, for your response and suggestion. I have added that tag. Regarding the question, I am handling REstClientException like you have explained. What I need is try to get the Exception inside handler and handle it there. In case of SocketTimeoutExceptionsI want to handle it gracefully in the client with a message or so. I have commented the same in this answer : https://mcmap.net/q/367653/-resttemplate-default-timeout-value . Please have a look..!Bulger
Well, I have found the request for this problem, but without due response. forum.springsource.org/…Shirtmaker

© 2022 - 2024 — McMap. All rights reserved.