Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在流量中生成分页WebClient请求并使用响应_Java_Spring_Spring Webflux_Project Reactor_Spring Webclient - Fatal编程技术网

Java 在流量中生成分页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

我向第三方web服务重复发出分页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实例决定。我已经更新了我问题中的代码片段以反映这一点。考虑到这一点和您的解决方案,是否有一种方法可以从平面图中向上游发出完成信号?相应地更新了答案。