Flux.buffer()与switchIfEmpty

时间:2019-11-01 09:10:09

标签: java spring rest project-reactor flux

我有一个场景,其中我将使用{p> 1从DB获取实体列表

repository.getAllByIds(ids)

这将返回Flux<Entity>

如果助焊剂为空,那么我需要致电handleAllEntitiesNotFound(),否则我需要致电handleNotFoundEntities()

repository.getAllByIds(ids)
                .buffer()
                .switchIfEmpty(__ -> handleAllEntitiesNotFound(ids, erroneousEntities))
                .flatMap(list -> handleNotFoundEntities(list))


private Flux<Entity> handleAllEntitiesNotFound(List<String> ids, List<ResponseError> erroneousEntities) {
    Flux.fromIterable(ids).subscribe(id -> erroneousEntities.add(new ResponseError("Not Found", "Not Found", id)));
    return Flux.empty();
}

我正在使用buffer()将列表收集到Flux<List<Entity>>

问题是,当我调用该服务时,它会暂停,没有响应,没有任何日志,如果我删除了行.switchIfEmpty(__ -> handleAllEntitiesNotFound(ids, erroneousEntities)),它会工作并返回响应,但不处理handleAllEntitiesNotFound

buffer()switchIfEmpty()一起使用可能是什么问题

1 个答案:

答案 0 :(得分:1)

我认为您在这里得出了错误的结论-buffer()switchIfEmpty()一起工作毫无问题:

Flux.empty()
        .buffer()
        .switchIfEmpty(Mono.just(List.of(1)))
        .subscribe(System.out::println); //Prints "[1]"

但是,您的handleAllEntitiesNotFound()方法非常可疑。您似乎正在传递现有列表,创建一个新的Flux添加到其中,然后返回空的Flux。该示例无法运行,因此不可能缩小 exact 原因,但有几点很可能是罪魁祸首(无论是单独还是串联):

  • 更改传递到反应流中的现有对象通常被认为是错误的形式。返回一个 new 列表更加容易和安全(并且您可以在反应流完成时将列表与另一个列表合并)。
  • 您正在创建Flux只是为了从一个列表中读取内容,然后将元素添加到另一个列表中。这令人困惑,并且毫无意义。只需使用标准Java流(即ids.stream().map(id -> new ResponseError("Not Found", "Not Found", id)).collect(Collectors.toList())。)
  • 您要返回Flux.empty(),这几乎可以肯定是为什么没有响应的原因。人们通常会期望switchIfEmpty()返回一个非空的Flux,除非您故意只是将它用作副作用。
  • handleNotFoundEntities对于方法的名称来说似乎是一个奇怪的选择,该方法似乎会传递 找到的实体。