Java 在流量中生成分页WebClient请求并使用响应
我向第三方web服务重复发出分页WebClient请求。我现在使用的实现可以工作,但是被阻塞了 我迄今为止的执行情况:Java 在流量中生成分页WebClient请求并使用响应,java,spring,spring-webflux,project-reactor,spring-webclient,Java,Spring,Spring Webflux,Project Reactor,Spring Webclient,我向第三方web服务重复发出分页WebClient请求。我现在使用的实现可以工作,但是被阻塞了 我迄今为止的执行情况: var elementsPerPage = 10; Flux .generate( () -> 0, (pageIndex, emitter) -> { BlahServiceResponse blahServiceResponse = webClient
var elementsPerPage = 10;
Flux
.generate(
() -> 0,
(pageIndex, emitter) -> {
BlahServiceResponse blahServiceResponse =
webClient
.get()
.uri("/blah?pageIndex={pageIndex}", pageIndex)
.retrieve()
.bodyToMono(BlahServiceResponse.class)
.block(); // Yuck!!!
if (blahServiceResponse.getStudents().size() > 0) {
emitter.next(blahServiceResponse);
} else {
emitter.complete();
}
return pageIndex + elementsPerPage;
}
)
.subscribe(System.out::println); // Replace me with actual logic
出于可以理解的原因,如果上述代码更改为以下内容,则会引发“IllegalStateException:生成器未调用任何SynchronousSink方法”异常:
webClient
.get()
...
.bodyToMono(BlahServiceResponse.class)
.subscribe(emitter::next);
因此,我开始寻找一个异步接收器和。但就我所见,Flux中没有一个builder方法支持使用Flux | MonoSink生成有状态元素
我是否遗漏了什么?有没有更优雅的方法?静态分页
如果您事先知道页面索引,并且有规则生成它
var-elementsPerPage=10;
通量生成(
() -> 0,
(页面索引,发射器)->{
如果(页面索引<30){
下一步(页面索引);
}否则{
emitter.complete();
}
返回pageIndex+elementsPerPage;
})
.flatMap(页面索引->网络客户端
.get()
.uri(“/blah?pageIndex={pageIndex}”,pageIndex)
.retrieve()
.bodyToMono(BlahServiceResponse.class))
.subscribe(System.out::println);
动态分页
如果下一页索引取决于最后查询的页
publicstaticvoidmain(字符串[]args){
var elementsPerPage=10;
callWithPageIndex(0)
.展开(页面响应->{
如果(pagedResponse.getResponse().isEmpty()){
返回Mono.empty();
}否则{
使用PageIndex返回调用(pagedResponse.getPageIndex()+elementsPerPage);
}
})
.subscribe(System.out::println);
}
专用静态Mono调用WithPageIndex(整数pageIndex){
返回网络客户端
.get()
.uri(“/blah?pageIndex={pageIndex}”,pageIndex)
.retrieve()
.bodytomino(BlahServiceResponse.class)
.map(响应->新建页面响应(页面索引,响应));
}
@龙目山价值
静态类PagedResponse{
int-pageIndex;
T反应;
}
谢谢你,马丁。是否生成更多元素的决定由BlahServiceResponse实例决定。我已经更新了我问题中的代码片段以反映这一点。考虑到这一点和您的解决方案,是否有一种方法可以从平面图中向上游发出完成信号?相应地更新了答案。