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

РЕДАКТИРОВАТЬ:

Основываясь на предложениях, я изменил свой код на, но получаю сообщение об ошибке: «Асинхронное выполнение требует установки 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());
}

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


person Simon    schedule 21.07.2015    source источник
comment
Вы можете использовать Iterator вместо references.get(i). Вам не нужно вызывать .toString() в теле ответа, это уже String. Попробуйте задать этот вопрос на codereview.   -  person Sotirios Delimanolis    schedule 21.07.2015
comment
Вам не нужно каждый раз добавлять StringHttpMessageConverter. Одного раза достаточно, хотя обратите внимание, что он уже должен быть зарегистрирован по умолчанию.   -  person Sotirios Delimanolis    schedule 21.07.2015
comment
Вам также не нужно создавать новую RestTemplate каждую итерацию цикла. Один раз достаточно.   -  person Sotirios Delimanolis    schedule 21.07.2015
comment
Спасибо, но я все еще звоню на сервер 10 раз, чтобы получить 10 ссылок. Могу ли я сделать что-то более эффективное?   -  person Simon    schedule 21.07.2015
comment
Если ваш сервер не поддерживает пакетный API, нет.   -  person Sotirios Delimanolis    schedule 21.07.2015
comment
ХОРОШО. Я думаю, тогда это было бы ограничением сервера. Я отредактировал свой код в соответствии с вашими предложениями. Спасибо.   -  person Simon    schedule 21.07.2015
comment
Вы можете указать свое решение относительно сервера, поддерживающего пакетный API, в качестве ответа, и я приму его.   -  person Simon    schedule 21.07.2015


Ответы (1)


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

Вы можете использовать асинхронный вариант RestTemplate и выполнять эти вызовы параллельно.

person Brian Clozel    schedule 21.07.2015
comment
Спасибо - я думаю, что ваш ответ был лучшим, и поэтому я отметил его правильно. Однако я заметил, что если я использовал асинхронную версию resttemplate, оставшийся запрос занимает больше времени, чем синхронизированная версия, что странно... Вскоре я опубликую новый вопрос. - person Simon; 22.07.2015
comment
См. новый вопрос: stackoverflow.com/questions/ 31572475/ - person Simon; 22.07.2015
comment
ссылка не работает - person Manza; 09.12.2017