使用Spring Webclient同时进行分页API调用

时间:2019-11-26 19:53:52

标签: spring-mvc asynchronous spring-webflux project-reactor spring-webclient

我必须使用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(); ???

1 个答案:

答案 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()