Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.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 发生错误时如何停止反应器平面图_Java_Spring Webflux_Project Reactor - Fatal编程技术网

Java 发生错误时如何停止反应器平面图

Java 发生错误时如何停止反应器平面图,java,spring-webflux,project-reactor,Java,Spring Webflux,Project Reactor,我正在用反应堆链加载数据: public Flux<Report> collectReport(List<MarkId> marks) { return Flux.fromIterable(marks) .flatMap(this::prepareRequest) .collectList() .flatMapIterable(e -> e)

我正在用反应堆链加载数据:

 public Flux<Report> collectReport(List<MarkId> marks) {
        return Flux.fromIterable(marks)
                .flatMap(this::prepareRequest)
                .collectList()
                .flatMapIterable(e -> e)
                .delayElements(Duration.ofMillis(200))
                .concatMap(this::createReport)
                .retryWhen(retryConfig)
                .onErrorResume(throwable -> {
                    log.error(throwable.getMessage()); 
                    return Mono.empty();
                });
                .flatMap(response -> some actions here..//)
                .buffer(1000)
                .publishOn(Schedulers.newParallel("The rep saving", 4))
                .flatMap(googleAnalyticsReports -> {
                            //saving to database here
                        }
                );
    }
公共流量报告(列表标记){
返回流量。从可测量(标记)
.flatMap(此::prepareRequest)
.LIST()
.flatMapIterable(e->e)
.延迟要素(持续时间单位:百万(200))
.concatMap(此::createReport)
.retryWhen(retryConfig)
.OneRorResume(可丢弃->{
log.error(throwable.getMessage());
返回Mono.empty();
});
.flatMap(响应->此处的一些操作..//)
.缓冲器(1000)
.publishOn(Schedulers.newParallel(“代表保存”,4))
.flatMap(谷歌分析报告->{
//在此处保存到数据库
}
);
}
concatMap(this::createReport)
可能会产生错误,并将执行重试。所以,在对一个id的重试未用尽之前,应用程序将停止并不会发送另一个请求

为了提高加载速度,我决定将此
concatMap
替换为
flatMap
。但是
flatMap
是不可预测的。现在,如果出现错误,应用程序将继续从其他线程发送请求,忽略一些id已经在<代码>重试情况下的事实,并且通过此行为,我将继续在超时激活之前从服务器获取429错误(API限制)


所以,我的问题是:如果特定id出现特定错误,我如何停止从flatMap加载数据,并等待所有重试都结束?若我得到429错误,应用程序应该停止加载当前id的数据,然后转到重试案例,在那个里我可以等待通过超时。虽然未传递此id,但应用程序不应发送另一个请求,请求列表中的其他id。

使用
flatMap
无法尝试,原因很简单,
flatMap
急切地订阅内部流-即,它不会等到一个流完成后再订阅下一个流。由于createReport是异步的,一旦工作卸载到
I/O
线程,
flatMap
将从下一个元素创建一个新流并订阅它。将其与
concatMap
进行比较,后者在订阅下一个流之前等待内部流完成

你想做的是有点自相矛盾-你想提高加载速度(所以你想并行调用),但你想订购这些请求。您希望请求必须了解以前任何请求的状态
flatMap
不提供任何订购保证,因此您不能在此处使用此运算符