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
不提供任何订购保证,因此您不能在此处使用此运算符