重复请求,直到根据上次响应的值满足webflux中的条件

时间:2019-01-13 11:16:26

标签: java spring-webflux

使用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)

1 个答案:

答案 0 :(得分:1)

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

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();
     });