Spring Boot Webclient-多调用的等待结束响应

时间:2019-06-22 09:05:58

标签: rest spring-boot asynchronous jpa-2.0 spring-webflux

我要多次调用rest终结点,并将响应保存到使用jpa的数据库中。收到所有响应后,我必须在db上调用存储过程。

我正在尝试使用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上,我仅将响应保存在db上。

如何等待所有请求完成以调用db上的存储过程?

我知道我没有将阻塞电话与阻塞电话混在一起

您对解决问题有什么建议吗?

谢谢 米尔科

1 个答案:

答案 0 :(得分:1)

我已经使用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或类似的运算符正确处理错误,否则通量将终止。选中here

此代码将触发所有请求,并将响应收集到列表中,然后订阅它。