Set timeouts to RestTemplate


Timeout to RestTemplate

  • We can set Timeout in 2 ways to RestTemplate
  • First way is set setConnectTimeout(), setReadTimeout() on RestTemplateBuilder object.
  • second way is get HttpRequestFactory from RestTemplate and set timeouts.

Using RestTemplateBuilder

package com.example.demo;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.http.MediaType;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

@Service
public class UserService {

	private final RestTemplate restTemplate;

	public UserService(RestTemplateBuilder restTemplateBuilder) {
		this.restTemplate = restTemplateBuilder.setConnectTimeout(2000).setReadTimeout(3000)
				.errorHandler(new MyErrorHandler()).build();
		List<HttpMessageConverter<?>> messageConverters = new ArrayList<>();
		MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
		converter.setSupportedMediaTypes(Collections.singletonList(MediaType.ALL));
		messageConverters.add(converter);
		this.restTemplate.setMessageConverters(messageConverters);
	}

	public Object getUser(int userId) {
		return this.restTemplate.getForObject("https://jsonplaceholder.typicode.com/todos/" + userId, Object.class);
	}
}

Using SimpleClientHttpRequestFactory

package com.example.demo;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.http.MediaType;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

@Service
public class UserService {

	private final RestTemplate restTemplate;

	public UserService(RestTemplateBuilder restTemplateBuilder) {
		this.restTemplate = restTemplateBuilder.errorHandler(new MyErrorHandler()).build();
		List<HttpMessageConverter<?>> messageConverters = new ArrayList<>();
		MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
		converter.setSupportedMediaTypes(Collections.singletonList(MediaType.ALL));
		messageConverters.add(converter);
		this.restTemplate.setMessageConverters(messageConverters);
	}

	public Object getUser(int userId) {
		SimpleClientHttpRequestFactory httpComponentsClientHttpRequestFactory = (SimpleClientHttpRequestFactory) this.restTemplate
				.getRequestFactory();
		httpComponentsClientHttpRequestFactory.setConnectTimeout(2000);
		httpComponentsClientHttpRequestFactory.setReadTimeout(3000);
		return this.restTemplate.getForObject("https://jsonplaceholder.typicode.com/todos/" + userId, Object.class);
	}
}