2015-07-21 2 views
0

Мне нужно запросить сервер для ссылок, которые можно получить, предоставив серверу ссылку.Spring RestTemplate - передача пакетов GET-запросов

Допустим, у меня есть 10 ссылок, и я хочу получить 10 ссылок назад за один раз в arrayList.

Ниже приведен самый эффективный способ сделать это? Он выглядит довольно ресурсоемким и занимает приблизительно 4672 мс для генерации

Я просмотрел документы для RestTemplate: http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/client/RestTemplate.html#getForEntity-java.lang.String-java.lang.Class-java.util.Map-, но, похоже, нет более простого способа сделать то, что я хочу сделать.

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

EDIT:

На основе предложений, я изменил мой код, но я получаю сообщение об ошибке: "Асинхронное выполнение требующей AsyncTaskExecutor быть установлено":

ArrayList<String> references = new ArrayList<>(); 
ArrayList<String> links = new ArrayList<>(); 
AsyncRestTemplate asyncRestTemplate = new AsyncRestTemplate(new 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()); 
} 

I посмотрел на справочные документы, но ни один из конструкторов не позволяет мне устанавливать как AsyncListenableTaskExecutor, так и ClientHttpRequestFactory (ClientHttpRequestFactory, который я использовал - CustomClientHttpRequestFactory, только расширяет SimpleClientHttpRequestFactory, чтобы я мог получить перенаправленные ссылки успешно ly: http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/client/AsyncRestTemplate.html#AsyncRestTemplate--

+0

Вы можете использовать 'Iterator' вместо' reference.get (i) '. Вам не нужно вызывать '.toString()' в теле ответа, это уже 'String'. Подумайте об этом на codereview. –

+0

Вам не нужно добавлять 'StringHttpMessageConverter' каждый раз. Один раз достаточно, но учтите, что по умолчанию уже нужно было зарегистрировать. –

+0

Вам также не нужно создавать новую 'RestTemplate' каждую итерацию цикла. Достаточно один раз. –

ответ

2

Здесь вы делаете эти вызовы REST последовательно - то есть ничего не делается параллельно.

Вы можете использовать the asynchronous variant of RestTemplate и выполнять эти вызовы параллельно.

+0

Спасибо - я думаю, что ваш ответ был лучшим, и поэтому я отметил его правильно. Тем не менее, я заметил, что если бы я использовал асинхронную версию resttemplate, остальной запрос займет больше времени, чтобы вернуться, а затем версия синхронизации, которая является странной ... В ближайшее время я опубликую новый вопрос. – Simon

+0

Смотрите новый вопрос: http://stackoverflow.com/questions/31572475/spring-resttemplate-async-vs-sync-resttemplate – Simon

+0

ссылка не работает – Manza

Смежные вопросы