我必须使用Webclient进行分页的API调用,并最终合并所有结果。 例如:人员最新的1000笔交易详细信息。 在一个电话中,我将在json响应(列表)中获得最多100个对象。 我最多只能为此人获得1000条记录。
在伪代码-Java中,它可能看起来像这样
int Total = 1000;
int maxEachCall = 100;
int noOfCalls = maxTotal/maxEachCall;
int startIndex = 0;
List<MyDto> mailList = new ArrayList();
for(int i =startIndex; i<noOfCalls ;i+100){
List<MyDto> list = webClient.get().uri(baseUri+"?startIndex"+startIndex)
.retrieve()
.bodyToMono(MyDto.class)
.retry(3)
.block();
mainList.addAll(list);
if(startIndex>900 || list.size()<100){
break;
}
}
如何在Spring MVC中不阻塞的情况下以反应方式编写同一件事?
像这样的事情???我不知道。帮帮我
int Total = 1000;
int maxEachCall = 100;
int noOfCalls = maxTotal/maxEachCall;
int startIndex = 0;
Flux.range(1,noOfCalls)
.flatMap(
// tried to call api using startIndex but can't use startIndex here or manipulate it
)
.doOnError(e->LOGGER.info("Exception occured ",e))
.blockLast(); ???
答案 0 :(得分:0)
您可以执行以下操作:
Flux.range(0, 10)
.map(start -> start * 100)
.flatMap(
start -> webClient.get()
.uri(baseUri + "?startIndex=" + start)
.retrieve()
.bodyToMono(MyDtoCollection.class)
.map(c -> splitCollectionIntoIndividualMyDto(c)) //or something to that effect, since you'll get 100 `MyDto` at a time and presumably need to split them.
)
.collectList();
...,这将为您提供包含所有分页结果的Mono<List<MyDto>>
。如果您的堆栈是完全反应性的,那么您将继续在其他地方的反应性链中使用该Mono
。如果还没有完全反应,而您只是在使用电抗器,那么您可以选择在最明智的位置block()
。