是的,您的观察是正确的。从 Tomcat 10.1.16 开始,
Nio2Endpoint
不会在虚拟线程上执行代码,而 NioEndpoint
则会执行。虽然 AbstractEndpoint
(两者的共同超类)支持虚拟线程的使用,但 Nio2Endpoint.setSocketOptions
方法调用 AbstractEndpoint.processSocket
,参数 dispatch
硬编码为 false,并带有注释:继续在同一线程上进行处理,因为接受器是异步的。我认为这与 NIO2 Tomcat Connector 的潜在异步性有关。有趣的是,它确实在虚拟线程上创建了它的 Acceptor,但我们不能从中受益匪浅。
我相信这是这个版本的 Tomcat 的一个简单错误,看看它是否在后续版本中得到修复或向他们报告是有意义的。
顺便说一句,可以覆盖 Tomcat 连接器实现,并且修复似乎非常简单,并且覆盖 - 微不足道。如果您被锁定到此版本的 Tomcat,并且您的工作线程的虚拟性质足够重要,请告诉我,我们可以尝试这样做。