根据上次响应的值,重复请求直到在 webflux 中满足条件
Repeat request until condition is met in webflux, based on last response's value
使用 spring 启动响应式 Web 的 WebClient,我需要调用一个 API 那个 returns 一个 XML 响应。响应可能包含 NextToken - 如果它存在,我想使用最后返回的 NextToken 值再次调用 Web 服务,直到响应中不存在 NextToken。
当前代码 returns 第一个和第二个请求的正确结果,但它没有连接返回值,第三个和每个后续请求都是第二个请求的副本。
如何有条件地重复请求,直到我在 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)
我认为您可以使用扩展运算符 - 如下所示:
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();
});
使用 spring 启动响应式 Web 的 WebClient,我需要调用一个 API 那个 returns 一个 XML 响应。响应可能包含 NextToken - 如果它存在,我想使用最后返回的 NextToken 值再次调用 Web 服务,直到响应中不存在 NextToken。
当前代码 returns 第一个和第二个请求的正确结果,但它没有连接返回值,第三个和每个后续请求都是第二个请求的副本。
如何有条件地重复请求,直到我在 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)
我认为您可以使用扩展运算符 - 如下所示:
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();
});