I wrote the following code to test the performance of both the sync RestTemplate and AsyncRestTemplate. I just ran it a few times manually on POSTMAN.
We are just passing 10 references into a GET call so that we can return 10 links:
RestTemplate - synchronous and returns in 2806ms:
ArrayList<String> references = new ArrayList<>(); ArrayList<String> links = new ArrayList<>(); RestTemplate restTemplate = new RestTemplate(); restTemplate.getMessageConverters().add(new StringHttpMessageConverter()); for (int i = 0; i < 10; i++) { ResponseEntity<String> resource = restTemplate.getForEntity(references.get(i), String.class); links.add(resource.getBody().toString()); }
RestTemplate - asynchronous and returns in 2794ms:
//Creating a synchronizedList so that when the async resttemplate returns, there will be no concurrency issues List<String> links = Collections.synchronizedList(new ArrayList<String>()); //CustomClientHttpRequestFactory just extends SimpleClientHttpRequestFactory but disables automatic redirects in SimpleClientHttpRequestFactory CustomClientHttpRequestFactory customClientHttpRequestFactory = new CustomClientHttpRequestFactory(); //Setting the ThreadPoolTaskExecutor for the Async calls org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor pool = new org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor(); pool.setCorePoolSize(5); pool.setMaxPoolSize(10); pool.setWaitForTasksToCompleteOnShutdown(true); pool.initialize(); //Setting the TaskExecutor to the ThreadPoolTaskExecutor customClientHttpRequestFactory.setTaskExecutor(pool); ArrayList<String> references = new ArrayList<>(); ArrayList<String> links = new ArrayList<>(); AsyncRestTemplate asyncRestTemplate = new AsyncRestTemplate(customClientHttpRequestFactory); restTemplate.getMessageConverters().add(new StringHttpMessageConverter()); for (int i = 0; i < 10; i++) { Future<ResponseEntity<String>> resource = asyncRestTemplate.getForEntity(references.get(i), String.class); ResponseEntity<String> entity = resource.get(); //this should start up 10 threads to get the links asynchronously links.add(entity.getBody().toString()); }
In most cases, both methods actually return back the results with a very similar time, averaging 2800ms in both async and sync calls.
Am I doing something incorrect as I would have expected the async call to be much faster?