Question

Basically, what I'm facing today is the following:

  • Handle Request time out when doing Rest actions.

Seems simple written, but not as easy to code.

This is my implementation so far:

List<ClientHttpRequestInterceptor> interceptors = new ArrayList<ClientHttpRequestInterceptor>();
interceptors.add( new NetworkInterceptor() );

tpl.setInterceptors( interceptors );

So now, after setting interceptors, I'd like to set custom timeout configurations for the template.

So I do the following: tpl.getRequestFactory().

This is returning a InterceptingClientHttpRequestFactory instead of SimpleClientHttpRequestFactory as would be returned in case no interceptors were set.

So as it is returning that InterceptingClientHttpRequestFactory instance, I can't set the Timeout.

You can check the sourcecode of Spring, the last method: http://grepcode.com/file_/repo1.maven.org/maven2/org.springframework/spring-web/3.1.1.RELEASE/org/springframework/http/client/support/InterceptingHttpAccessor.java/?v=source

So... Any tips?

Was it helpful?

Solution

Assuming tpl is a RestTemplate, you can pass a SimpleClientHttpRequestFactory as parameter to its constructor:

    List<ClientHttpRequestInterceptor> interceptors = new ArrayList<ClientHttpRequestInterceptor>();
    interceptors.add( new NetworkInterceptor() );

    SimpleClientHttpRequestFactory s = new SimpleClientHttpRequestFactory();
    s.setReadTimeout(5000);
    s.setConnectTimeout(1000);

    RestTemplate tpl = new RestTemplate(s);//Or however you instantiated it
    tpl.setInterceptors( interceptors );

    ClientHttpRequestFactory c =  tpl.getRequestFactory();

Hope it helps.

OTHER TIPS

i see the androidannotations document has @Rest annotations

@Rest(rootUrl="yourRootUrl",requestFactory=AppRequestFacetory.class,converters ={..},interceptors={..})
public interface RestApis extends RestClientErrorHandling{...};

AppRequestFacetory.class set TIMEOUT as belows:

@EBean
class AppRequestFactory extends SimpleClientHttpRequestFactory {

     @AfterInject
     void afterinject() {
         setReadTimeout(20*1000); //set 20s read timeout
         setConnectTimeout(20*1000); //set 20s connect timeout
     }
}

and it works . enjoy androidannotations rest api

When I needed to configure Android annotations rest client I've used code like this:

    ClientHttpRequestFactory requestFactory = restClient.getRestTemplate().getRequestFactory();
    if (requestFactory instanceof SimpleClientHttpRequestFactory) {
        Log.d("HTTP", "HttpUrlConnection is used");
        ((SimpleClientHttpRequestFactory) requestFactory).setConnectTimeout(3 * 1000);
        ((SimpleClientHttpRequestFactory) requestFactory).setReadTimeout(3 * 1000);
    } else if (requestFactory instanceof HttpComponentsClientHttpRequestFactory) {
        Log.d("HTTP", "HttpClient is used");
        ((HttpComponentsClientHttpRequestFactory) requestFactory).setReadTimeout(3 * 1000);
        ((HttpComponentsClientHttpRequestFactory) requestFactory).setConnectTimeout(3 * 1000);
    }
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top