java Sping Boot 最大请求数和线程数应为1(server.tomcat.max-threads=1)

kadbb459  于 2023-04-19  发布在  Java
关注(0)|答案(2)|浏览(157)

背景

我正在试验SpringWebflux,用于响应式应用程序,如果应用程序中只有一个线程,我希望看到应用程序的行为。

提问

我怎样才能让Spring只使用一个线程来处理所有可能到来的请求?
到目前为止,我设置了server.tomcat.max-threads=1,但是我仍然看到每个请求都创建了多个线程。你可以在下面看到运行应用程序的一些日志:

请让我知道,如果我错过了什么,我应该添加在我的配置,使这一工作。
谢谢你的帮助!

vom3gejh

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请求的事件循环无关

yyyllmsg

yyyllmsg2#

只是为了补充另一个完全正确的答案。
您在日志中看到的线程只是调度线程,因此它们在事件循环上调度工作。如果您只需要一个事件循环,请按照另一个答案的建议执行。
另一方面,如果你只想要一个调度器,你可以在链中的任何Flux/Mono上添加.onSubscribe(Schedulers.single())
这将在订阅应用程序期间应用单线程调度程序。
值得注意的是,这并不是它的目的,性能可能会受到极大的影响。
该单个调度器主要用于:
针对低延迟进行了优化
根据docs,并且意味着单次操作。

相关问题