繁体   English   中英

订阅一个空的 Flux 会导致无限循环

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM