使用递增的查询参数重复WebClient调用

时间:2019-07-20 12:19:04

标签: java spring spring-webflux reactor spring-webclient

我正在尝试构建一种方法,该方法应该在一个查询参数小于45000的情况下向一个外部端点执行许多HTTP请求。

我需要这样做,因为外部端点允许我获取100个项目,但要获取的项目却超过44000个。

  $pageid = $('.page-id').find('name').clone().text('');
  $('.which-page').find('value').contents().wrap($pageid);

这似乎有用,因为日志记录的offset参数增加了,但是HTTP请求的offset等于0。该方法返回的前100项而不是44566项

1 个答案:

答案 0 :(得分:1)

实际上,问题是webclient是在订阅之前急切构建的,并且具有初始offset值的“缓存”。在每次调用之后,Flux被重新订阅,但是准备好的具有偏移量的Web服务调用仍被“缓存”。 您必须以惰性方式提供weblient(例如,将其包装在lambda中),这将强制为每次调用重新计算其所有参数。有一个特殊的运算符-defer()

解决方案

Mono<Model> response = Mono.defer(() -> webClientBuilder
        .build()
        .get()
        .uri(uriBuilder -> uriBuilder
                .path("/getItems")
                .queryParam("limit", 100)
                .queryParam("offset", getOffset())
                .build())
        .retrieve()
        .bodyToMono(Model.class)
);


Flux.from(response
        .doOnEach(System.out::println)
        .flatMap(model -> {
            setOffset(getOffset() + 100);
            log.info("Offset: " + getOffset());
            return repository.saveAll(model.getData().getResults()).collectList();
        }).delayElement(Duration.ofSeconds(15))
).repeat(() -> getOffset() <= 45000).subscribe();

另一个问题显示了渴望执行的相同问题: Mono switchIfEmpty() is always called