我尝试在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协议不支持虚拟线程?以前有人遇到过这个问题吗?
1条答案
按热度按时间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和虚拟性质的工作线程是足够重要的,我们可以尝试这样做。
与你的问题没有直接关系,但这条线
字符串
在我们的上下文中,
AbstractEndpoint.createExecutor
不会影响线程创建过程,而是硬编码了org.apache.tomcat.util.threads.VirtualThreadExecutor
的创建,它甚至不是org.apache.catalina.Executor
,而只是java.util.concurrent.Executor
。