我正在尝试构建一种方法,该方法应该在一个查询参数小于45000的情况下向一个外部端点执行许多HTTP请求。
我需要这样做,因为外部端点允许我获取100个项目,但要获取的项目却超过44000个。
$pageid = $('.page-id').find('name').clone().text('');
$('.which-page').find('value').contents().wrap($pageid);
这似乎有用,因为日志记录的offset参数增加了,但是HTTP请求的offset等于0。该方法返回的前100项而不是44566项
答案 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