Spring RestTemplate - предаване на партиди от GET заявки

Трябва да направя заявка към сървър за връзки, които могат да бъдат получени, като дам препратка на сървъра.

Да приемем, че имам 10 препратки и искам да получа обратно 10 връзки наведнъж в arrayList.

Дали по-долу е най-ефективният начин да го направите? Изглежда доста ресурсоемко и отнема приблизително 4672ms за генериране

Разгледах документите за 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