我有一个场景,其中我将使用{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()
一起使用可能是什么问题
答案 0 :(得分:1)
我认为您在这里得出了错误的结论-buffer()
和switchIfEmpty()
一起工作毫无问题:
Flux.empty()
.buffer()
.switchIfEmpty(Mono.just(List.of(1)))
.subscribe(System.out::println); //Prints "[1]"
但是,您的handleAllEntitiesNotFound()
方法非常可疑。您似乎正在传递现有列表,创建一个新的Flux
添加到其中,然后返回空的Flux。该示例无法运行,因此不可能缩小 exact 原因,但有几点很可能是罪魁祸首(无论是单独还是串联):
Flux
只是为了从一个列表中读取内容,然后将元素添加到另一个列表中。这令人困惑,并且毫无意义。只需使用标准Java流(即ids.stream().map(id -> new ResponseError("Not Found", "Not Found", id)).collect(Collectors.toList())
。)Flux.empty()
,这几乎可以肯定是为什么没有响应的原因。人们通常会期望switchIfEmpty()
返回一个非空的Flux,除非您故意只是将它用作副作用。handleNotFoundEntities
对于方法的名称来说似乎是一个奇怪的选择,该方法似乎会传递 找到的实体。