首页 > 解决方案 > Spring Webflux / Reactor 发布调用线程

问题描述

所以我知道 Spring WebFlux 和 Reactor 在后台使用 netty for nio,现在我想释放调用线程以释放资源以处理更多请求。下面的简单代码是释放调用线程吗?

@GetMapping("/foo")
public Mono<Void> bar() {

  someService.veryLongSyncOperation();

  return Mono.empty();
}

我没有将服务调用包装在 Flux/Mono 中,我只是想首先验证调用线程是否在服务完成长时间工作时被释放。这足以实现调用线程释放吗?如果是这样,有没有办法测试这个?

我在想框架看到了返回类型,这足以让它知道它必须释放调用线程。

标签: nettyreactive-programmingspring-webfluxproject-reactor

解决方案


您可以使用反应堆参考指南.subscribeOn(Schedulers.elastic())中提到的

@GetMapping("/foo")
public Mono<Void> bar() {
    return Mono.fromCallable(() -> someService.veryLongSyncOperation())
            .subscribeOn(Schedulers.elastic())
            .then();
}

每个订阅都将发生在来自 Schedulers.elastic() 的专用单线程工作人员上。

更新:现在有Schedulers.boundedElastic()调度程序。我建议默认使用它。


推荐阅读