[英]Subscribing to an empty Flux causes an infinite loop
我有一个看起来像这样的调用链:
public ResponseEntity<Flux<Entity>> create() {
return ResponseEntity.ok(saveList());
}
public Flux<Entity> saveList() {
if(list.isEmpty()) return Flux.empty();
return repository.saveAll(list);
}
无论我是直接返回Flux.empty()
还是将其发送到数据库调用,如果我将.map()
调用添加到create()
链上,它都不会执行,因为没有元素,正如我们所期望的那样。 但是,如果我添加.switchIfEmpty()
,这也不会执行。 无论我为一个空的 Flux 尝试过什么样的处理程序组合,它总是会导致无限循环,我认为是因为它正在等待添加一个元素以便它可以发出它。
文档建议Flux.empty()
应该完成而不发出任何东西,但是记录 Flux 显示只调用了onSubscribe()
和request()
,所以它没有完成,因此为什么。 switchIfEmpty()
也不会被调用。
当我订阅它时,我需要做什么才能让一个空的 Flux 完成?
任何非零大小的 Flux 都会成功,但我已经尝试了许多不同的空 Flux 类型,例如来自数组的,但都失败了。
我正在为switchIfEmpty()
使用硬编码的非空 Publisher,因为这似乎是绝对必要的。
由于我没有收到答复(像往常一样,我可能会补充) ,我创建了一个解决方法。
首先,我将响应收集在一个列表中,然后使用Flux.error()
,然后在调用者中使用onErrorComplete()
() 完成执行。
public Flux<ListItem> create(List<ListItem> originalList) {
return repository.get()
.collectList()
.flatMapMany(list -> {
if(list.isEmpty()) return Flux.error(new IllegalStateException());
return repository.saveAll(list);
})
.switchIfEmpty(repository.saveAll(originalList)
.onErrorComplete();
由于我的flatMapMany()
依赖于初始数据库调用,因此我还使用switchIfEmpty()
来捕获任何响应为空的情况。 这不一定适合所有用例,但可能与可能导致空 Flux 的问题类型相关。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.