当前位置: 首页 > 知识库问答 >
问题:

Spring Webflux/Reactor释放调用线程

松和安
2023-03-14

因此,我理解在胡德Spring WebFlux和Reactor使用netty for nio,现在我想释放调用线程以释放资源,以便处理更多的请求。下面是释放调用线程的简单代码吗?

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

  someService.veryLongSyncOperation();

  return Mono.empty();
}

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

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

共有1个答案

杨和蔼
2023-03-14

您可以使用.subscribeon(Schedulers.弹性()),正如《反应堆参考指南》中提到的

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

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

UPD:现在有schedulers.boundedelastic()调度程序。我建议在默认情况下使用它。

 类似资料:
  • 当我使用带有固定连接提供者的TCP客户端时,我不能重用连接。 他们使连接超过maxConnection变量。 这是我写的。 即使我使用10个maxConnection,比如“ConnectionProvider”。固定(“测试”,10)”,有22个空闲连接。天啊 //NettyClient.java //NettyClientTest。Java语言 14:55:27.397[reactor-tcp

  • 早期除了reactor线程外,还设置了writer写成,用于监听worker进程的PIPE,写回TCP客户端。 1.6.12后将这2个角色做了合并,直接在reactor进程内监听PIPE,写回TCP客户端。 合并后的好处是,recv/send/close都是在同一个线程内完成的,不存在之前复杂的时序问题。一切变得更加简单了。另外outbuffer和sendfile也可以更轻松实现。 swoole_

  • 反应器-http-epoll-1 reactor-http-epoll-2 reactor-http-epoll-3 reactor-http-epoll-4 我知道我可以使用Reactor调度器来卸载阻塞工作。我的问题更多的是--这4个线程是什么,我们在哪里有这种配置?

  • 当我运行我的应用程序时,有时我会在控制台中收到一条消息,说明: 系统:调用释放失败的资源。 这并不总是发生,所以我很难找到问题所在。有没有办法让控制台指定它是哪个资源? 谢啦

  • https://projectreactor.io/docs/core/release/api/reactor/core/publisher/doc-files/marbles/flatMapForFlux.svg 这个问题是关于项目反应器中Flux发布者中的平面图函数。根据我们对平面地图的理解,我们必须返回一个发布者,平面地图将在内部订阅该发布者。我们想知道的是线程如何处理这种情况。是要多线程还

  • 我在很多地方读过,线程池减少了线程创建开销,从而提高了性能。但是一旦线程执行完它的run方法,它就会进入dead/terminated状态,这意味着它可以再次重新启动。 那么,线程池如何处理线程的释放呢?它是否真的以某种方式保存线程以服务下一个任务,或者在每次提交任务时在内部创建新线程?