You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,提问作者君主不是你

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 11:54:04