我正在试验SpringWebflux,用于响应式应用程序,如果应用程序中只有一个线程,我希望看到应用程序的行为。
我怎样才能让Spring只使用一个线程来处理所有可能到来的请求?到目前为止,我设置了server.tomcat.max-threads=1,但是我仍然看到每个请求都创建了多个线程。你可以在下面看到运行应用程序的一些日志:
server.tomcat.max-threads=1
请让我知道,如果我错过了什么,我应该添加在我的配置,使这一工作。谢谢你的帮助!
vom3gejh1#
默认情况下,WebFlux与Tomcat没有任何关系(不过,您可以将WebFlux配置为使用Tomcat/Undertow/Jetty而不是Netty)。WebFlux默认使用Netty,这甚至不接近servlet。在WebFlux中,所有的Web请求都是通过事件循环来处理的,在内部它使用React式Netty来处理Web请求。用于服务Web请求的线程的名称如下:reactor-http-nio-4如果你想配置事件循环使用的线程数,你可以在应用程序启动之前通过一个VM参数来完成:
-Dreactor.netty.ioWorkerCount=1
例如,它看起来像这样:
java -jar application.jar -Dreactor.netty.ioWorkerCount=1
另外:您在日志中看到的parallel-n线程是来自并行调度程序的线程,它与Flux.interval()方法一起使用。这些线程与服务Web请求的事件循环无关
parallel-n
Flux.interval()
yyyllmsg2#
只是为了补充另一个完全正确的答案。您在日志中看到的线程只是调度线程,因此它们在事件循环上调度工作。如果您只需要一个事件循环,请按照另一个答案的建议执行。另一方面,如果你只想要一个调度器,你可以在链中的任何Flux/Mono上添加.onSubscribe(Schedulers.single())。这将在订阅应用程序期间应用单线程调度程序。值得注意的是,这并不是它的目的,性能可能会受到极大的影响。该单个调度器主要用于:针对低延迟进行了优化根据docs,并且意味着单次操作。
Flux/Mono
.onSubscribe(Schedulers.single())
2条答案
按热度按时间vom3gejh1#
默认情况下,WebFlux与Tomcat没有任何关系(不过,您可以将WebFlux配置为使用Tomcat/Undertow/Jetty而不是Netty)。WebFlux默认使用Netty,这甚至不接近servlet。
在WebFlux中,所有的Web请求都是通过事件循环来处理的,在内部它使用React式Netty来处理Web请求。
用于服务Web请求的线程的名称如下:
reactor-http-nio-4
如果你想配置事件循环使用的线程数,你可以在应用程序启动之前通过一个VM参数来完成:
例如,它看起来像这样:
另外:您在日志中看到的
parallel-n
线程是来自并行调度程序的线程,它与Flux.interval()
方法一起使用。这些线程与服务Web请求的事件循环无关yyyllmsg2#
只是为了补充另一个完全正确的答案。
您在日志中看到的线程只是调度线程,因此它们在事件循环上调度工作。如果您只需要一个事件循环,请按照另一个答案的建议执行。
另一方面,如果你只想要一个调度器,你可以在链中的任何
Flux/Mono
上添加.onSubscribe(Schedulers.single())
。这将在订阅应用程序期间应用单线程调度程序。
值得注意的是,这并不是它的目的,性能可能会受到极大的影响。
该单个调度器主要用于:
针对低延迟进行了优化
根据docs,并且意味着单次操作。