【问题标题】:Making pagination API calls simulaneously using Spring Webclient使用 Spring Webclient 同时进行分页 API 调用
【发布时间】:2020-03-22 07:37:10
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    你可以做类似的事情:

    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&lt;List&lt;MyDto&gt;&gt;。如果您的堆栈是完全反应式的,那么您将继续在其他地方的反应式链中使用 Mono。如果(尚未)完全反应,并且您只是在此位使用反应器,那么您可以选择在最合理的位置block()

    【讨论】:

    • 如何在特定条件下打破管道并组装结果?我在 if 中又添加了一个条件。
    • @AsifAnsari filter() 呼叫可能是您在 flatMap() 呼叫之后所追求的。
    • filter() 将解析所有发出的值,对吗?如果我想在 5 点停止,它仍然会过滤 6 到 10 不必要的。我的意思是它不会爆发,对吧?
    • @AsifAnsari 是的,它会的。听起来您想获得一个块,对其进行处理,然后决定是否要获得下一个块?这在这种情况下是行不通的,因为所有这些 Web 请求都是同时有效地发出的。如果你一次处理一个,你可以这样做,但这显然会花费更长的时间(而且使用反应器根本没有太大的优势。)
    猜你喜欢
    • 2018-10-16
    • 2018-06-11
    • 2018-09-16
    • 2021-08-14
    • 1970-01-01
    • 2020-10-30
    • 2019-02-14
    • 2019-04-15
    • 1970-01-01
    相关资源
    最近更新 更多