Apache Tomcat虚拟线程

x7yiwoj4  于 12个月前  发布在  Apache
关注(0)|答案(1)|浏览(202)

我尝试在Apache Tomcat 10.1.16上使用虚拟线程,配置如下:

<Executor name="tomcatThreadPoolVirtual" class="org.apache.catalina.core.StandardVirtualThreadExecutor"/>

    <Connector port="8080" protocol="org.apache.coyote.http11.Http11Nio2Protocol"
               connectionTimeout="20000"
               redirectPort="8443"
               maxParameterCount="1000"
               useVirtualThreads="true"
               />

字符串
但是当我发出请求时,我不在虚拟线程上:Thread[#76,Thread-14,5,main]。我也分析了我的应用程序,但是没有使用虚拟线程。
如果我使用Http11NioProtocol而不是Http11Nio2Protocol,所有请求都在虚拟线程上:VirtualThread[#65,http-nio-8080-virt-0]/runnable@ForkJoinPool-1-worker-1

<Executor name="tomcatThreadPoolVirtual" class="org.apache.catalina.core.StandardVirtualThreadExecutor"/>
    

    <!-- A "Connector" represents an endpoint by which requests are received org.apache.coyote.http11.Http11Nio2Protocol
         and responses are returned. Documentation at :
         HTTP Connector: /docs/config/http.html
         AJP  Connector: /docs/config/ajp.html
         Define a non-SSL/TLS HTTP/1.1 Connector on port 8080
    -->
    <Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
               connectionTimeout="20000"
               redirectPort="8443"
               maxParameterCount="1000"
               useVirtualThreads="true"
               />


HTTP 11Nio2协议不支持虚拟线程?以前有人遇到过这个问题吗?

jgovgodb

jgovgodb1#

是的,你的观察是正确的。从Tomcat 10.1.16开始,Nio2Endpoint不会在虚拟线程上执行代码,而NioEndpoint会。虽然AbstractEndpoint是两者的公共超类,支持使用虚拟线程,但Nio2Endpoint.setSocketOptions方法调用AbstractEndpoint.processSocket,参数dispatch硬编码为false,并带有注解:继续在同一个线程上处理,因为接受者是cnc。我相信这与NIO 2 Tomcat连接器的潜在兼容性有关。有趣的是,它确实在虚拟线程上创建了它的接受者,但我们不能从中受益太多。
我相信这是这个版本的Tomcat的一个明显的bug,看看它是否在以后的版本中被修复或者向他们报告是有意义的。
顺便说一句,这是可能的override Tomcat Connector implementation和修复似乎是很容易和压倒性的-微不足道的。请让我知道,如果你被锁定到这个版本的Tomcat和虚拟性质的工作线程是足够重要的,我们可以尝试这样做。
与你的问题没有直接关系,但这条线

<Executor name="tomcatThreadPoolVirtual" class="org.apache.catalina.core.StandardVirtualThreadExecutor"/>

字符串
在我们的上下文中,AbstractEndpoint.createExecutor不会影响线程创建过程,而是硬编码了org.apache.tomcat.util.threads.VirtualThreadExecutor的创建,它甚至不是org.apache.catalina.Executor,而只是java.util.concurrent.Executor

相关问题