Spring Boot Webclient - ожидание окончания ответа от нескольких вызовов - PullRequest
0 голосов
/ 22 июня 2019

Я вызываю конечную точку отдыха несколько раз и сохраняю ответ на БД с помощью jpa.Когда все ответы получены, я должен вызвать процедуру хранения на базе данных.

Я пытаюсь использовать webclient для выполнения этого запроса, но я не знаю, как ждать / проверить, что все запросы завершены.

это код, который я использую для вызова конечной точки:

private Mono<DSGetDataResponse> GetData(DSGetDataRequest dataRequest){
try {
   return
    weblicent.post()
    .uri("GetData")              
        .contentType(MediaType.APPLICATION_JSON)
    .accept(MediaType.APPLICATION_JSON_UTF8)
        .syncBody(dataRequest)
        .retrieve()
        .bodyToMono(DSGetDataResponse.class);
} catch (Exception e) {
log.info("Sono in catch (Exception");
e.printStackTrace();
return null;
        }
    }

и это код, который я использую для вызова вышеуказанного метода

Items_to_request().forEach( x -> {
 String token = tokenResponse.getTokenValue();
DSGetDataRequest dataRequest = new DSGetDataRequest(token, this.Richista_DS(x), null);
try{
    this.GetData(dataRequest).subscribe(dataResponse ->   this.handlerGetDataResponse(dataResponse));
}
catch (Exception e)
{log.info("Sono in catch (Exception");
e.printStackTrace();
}
});

В handlerGetDataResponse я сохраняю ответ только в БД.

Как дождаться завершения всех запросов для вызова процедуры сохранения в БД?

Я знаю, что не смешиваю блокирующий вызов с блокирующим вызовом

Есть ли у вас какие-либо предложения по решению проблемы?

Спасибо, Мирко

1 Ответ

1 голос
/ 22 июня 2019

Я переписал ваш код с помощью Flux

Flux.fromIterable(Items_to_request())
.flatMap( x -> {
    String token = tokenResponse.getTokenValue();
    DSGetDataRequest dataRequest = new DSGetDataRequest(token, this.Richista_DS(x), null);
    return this.GetData(dataRequest));
})
.onErrorResume(<add your logic>)
.collectList()
.subscribe(List<Data> data -> {< do what you want here})

Вам придется правильно обрабатывать ошибки, используя onErrorResume или onErrorContinue или подобные операторы, иначе поток будет прерван. Отметьте здесь

Этот код будет запускать все запросы и собирать ответ в список, а затем подписываться на него.

...