SpringBoot WebFlux整合MongoDB批量删除时count始终返回0如何解决
问题根因
你定义的Flux.fromIterable(ids)整段响应式处理流程仅完成了逻辑声明,没有被订阅触发执行,因此流内部的count.getAndAdd(1)逻辑完全不会运行,你直接返回了初始化值为0的AtomicInteger,所以结果永远是0。
此外在响应式编程中使用AtomicInteger这类外部共享变量统计数据是不推荐的写法,既不符合响应式无状态设计原则,也存在线程安全风险。
正确实现
@ApiOperation(value = "Delete multi cities") @DeleteMapping public Mono<ResponseEntity<Integer>> deleteByIds(@RequestBody @NotNull Set<String> ids) { return Flux.fromIterable(ids) .flatMap(cityService::findById) .flatMap(city -> cityService.deleteById(city.getId()).thenReturn(city)) // 统计成功删除的条目数 .count() .doOnNext(count -> log.debug("count = {}", count)) .map(count -> ResponseEntity.ok(count.intValue())); }
逻辑说明
- 整个响应式流会在Spring WebFlux订阅方法返回的
Mono时自动触发执行,无需手动订阅 - 用Reactor内置的
count()操作符统计流中成功处理的元素数量,完全规避了共享变量的线程安全问题 - 日志打印要放在流处理流程内,才能拿到执行后的真实统计值
内容的提问来源于stack exchange,提问作者君主不是你
相关产品推荐
相关产品推荐

