【问题标题】:Repeat request until condition is met in webflux, based on last response's value根据最后一个响应的值重复请求直到 webflux 中满足条件
【发布时间】:2019-01-13 11:16:26
【问题描述】:

使用 spring boot 响应式 Web 的 WebClient,我需要调用一个返回 XML 响应的 API。响应可能包含 NextToken - 如果它存在,我想使用最后返回的 NextToken 值再次调用 Web 服务,直到响应中不存在 NextToken。

当前代码为第一个和第二个请求返回正确的结果,但它没有连接返回的值,第三个和每个后续请求都是第二个的重复。

如何有条件地重复请求,直到满足takeUntil 中的以下条件,同时所有订单都连接起来?

client.request(EU, Orders, ListOrdersRequest.forShipped(userData, LocalDateTime.now().minusDays(7), LocalDateTime.now().minusHours(2).minusMinutes(2)), ListOrdersResponse.class)

    .flatMap(e -> {

      if (e.getListOrdersResult().getNextToken() != null) {
        return client.request(EU, Orders, ListOrdersRequest.byNextToken(userData, e.getListOrdersResult().getNextToken()), ListOrdersByNextTokenResponse.class)
            .mergeWith(x -> Flux.just(e));
      }
      return Flux.just(e);
    })

    .delayElements(Duration.ofMinutes(1))
    .repeat()
    .retryBackoff(10, Duration.ofMinutes(2), Duration.ofMinutes(20))
    .takeWhile(r -> r.getListOrdersResult().getNextToken() != null)
    .checkpoint("nextToken fetched", true)

【问题讨论】:

    标签: java spring-webflux


    【解决方案1】:

    我认为您可以使用扩展运算符 - 像这样:

    client.request(EU, Orders, ListOrdersRequest.forShipped(userData, LocalDateTime.now().minusDays(7), LocalDateTime.now().minusHours(2).minusMinutes(2)), ListOrdersResponse.class)
        .expand(e -> {
             if(e.getListOrdersResult().getNextToken() != null) {
                 return client.request(EU, Orders, ListOrdersRequest.byNextToken(userData, e.getListOrdersResult().getNextToken()), ListOrdersByNextTokenResponse.class);
             }
             return Flux.empty();
         });
    

    【讨论】:

      猜你喜欢
      • 2018-04-19
      • 2017-09-10
      • 2014-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-28
      • 1970-01-01
      • 2019-10-07
      相关资源
      最近更新 更多