RE: Tomcat 10 and virtual thread
COURTAULT Francois <[email protected]>
| Newsgroups | gmane.comp.jakarta.tomcat.user |
|---|---|
| Message-ID | <MR1PPF8993717D7E519108FF8D6C6F4603D9DC4A@MR1PPF8993717D7.FRAP264.PROD.OUTLOOK.COM> |
THALES GROUP LIMITED DISTRIBUTION to email recipients
Hello Christopher,
Just to be sure ...
For HTTP/1.1 request traffic and virtual thread usage, your recommendation is:
- Executor declaration in server.xml like:
<Executor name="virtualThread"
className="org.apache.catalina.core.StandardVirtualThreadExecutor" />
- Connector declaration in server.xml like:
<Connector executor="virtualThread" port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
redirectPort="8443"
maxParameterCount="1000">
</Connector>
instead of this connector only declaration like:
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
redirectPort="8443"
maxParameterCount="1000"
useVirtualThreads="true"> ==> create a executor where the className is set to org.apache.catalina.core.StandardVirtualThreadExecutor
</Connector>
or like:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
maxParameterCount="1000"
useVirtualThreads="true" /> ==> create a executor where the className is set to org.apache.catalina.core.StandardVirtualThreadExecutor
Is my understanding of your recommendation correct ?
Best Regards.
-----Original Message-----
From: Christopher Schultz <[email protected]>
Sent: lundi 3 novembre 2025 20:08
To: [email protected]
Subject: Re: Tomcat 10 and virtual thread
Francois,
On 11/3/25 1:39 PM, COURTAULT Francois wrote:
> I am confused because the way (see underneath) I configured initially seems OK: it triggers the virtual thread usage. Indeed I am able to see ForkJoinPool-1-worker-1 😊 in the thread dump I triggered
> * first, declare an executor in server.xml like below
> <Executor name="virtualThread"
> className="org.apache.catalina.core.StandardVirtualThreadExecutor" />
> * second, use a connector which will refer this above Executor thanks to its name attribute.
> The way I do it, is to update line 74, in server.xml, from <Connector port="8080" protocol="HTTP/1.1" to
> <Connector executor="virtualThread" port="8080" protocol="HTTP/1.1"
>
> If now I look at
> https://tomcat.apache.org/tomcat-10.1-doc/config/http.html
> The useVirtualThreads attribute is listed under the Standard Implementation section which talks about standard HTTP connectors (NIO and NIO2).
> So we should only use for protocol attribute one of the following Http11NioProtocol and Http11Nio2Protocol protocols.
>
> In your configuration, you don't use one of these above protocols.
>
> Why having several ways to enable virtual threads usage ?
This is historical. Tomcat used to support only <Connector> and then <Executor> was introduced, later. In order to support backward-compatible (and simpler) configurations, <Connector> will create an <Executor> if the <Connector> does not specify an <Executor>.
> So, what is the recommended configuration, for using virtual thread, to use ?
> - Define a new Executor with StandardVirtualThreadExecutor as a className attribute
> Define a connector on HTTP protocol with an executor attribute set to the name of the new Executor
> - Or
> <Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" or "org.apache.coyote.http11.Http11Nio2Protocol"
> connectionTimeout="20000"
> redirectPort="8443"
> maxParameterCount="1000"
> useVirtualThreads="true">
> </Connector>
>
> BTW for HTTP1.0/1.1 traffic with no TLS what Connector should we use ?
> - <Connector port="8080" protocol="HTTP/1.1"
> - or <Connector port="8080" protocol=" org.apache.coyote.http11.Http11NioProtocol"
> - or <Connector port="8080" protocol=" org.apache.coyote.http11.Http11Nio2Protocol"
I would recommend <Connector> + <Executor> because <Executor> supports more configuration options for the executor itself than <Connector> does. For example, configuring an <Executor> explicitly allows you to have a thread-pool whose connections can be retired after inactivity.
(That doesn't matter at all for Virtual Threads, as the thread pool itself is essentially always empty -- no threads are ever re-used.)
If you are looking for unrelated recommendations, I would also use NIO instead of NIO2. NIO has far more usage in the real world than NIO2.
NIO2 uses a different I/O model which was supposed to be much faster than NIO, but then NIO improved significantly and the promises of NIO2 were realized by NIO. *shrug*
-chris
> -----Original Message-----
> From: William Crowell <[email protected]>
> Sent: lundi 3 novembre 2025 17:15
> To: Tomcat Users List <[email protected]>
> Subject: Re: Tomcat 10 and virtual thread
>
> Hi,
>
> I have never tried doing it through the executor like that. How I enable virtual threads in server.xml is like this:
>
> <Connector port="8080" protocol="HTTP/1.1"
> connectionTimeout="20000"
> redirectPort="8443"
> maxParameterCount="1000"
> useVirtualThreads="true" />
>
> You should be using at least JDK21 for that to work. When you do a thread dump you will see virtual threads in the dump.
>
> Extra info FYI: Running with JVM argument -Djdk.tracePinnedThreads=full prints a complete stack trace when a thread blocks while pinned, with the native frames and frames holding monitors highlighted. Running with -Djdk.tracePinnedThreads=short limits the output to just the problematic frames:
>
> Thread[#41,ForkJoinPool-1-worker-4,5,CarrierThreads]
> com.mysql.cj.jdbc.ConnectionImpl.isValid(ConnectionImpl.java:2516) <== monitors:1 Thread[#39,ForkJoinPool-1-worker-2,5,CarrierThreads]
> com.mysql.cj.jdbc.ConnectionImpl.isValid(ConnectionImpl.java:2516) <== monitors:1 Thread[#41,ForkJoinPool-1-worker-4,5,CarrierThreads]
> com.mysql.cj.jdbc.ConnectionImpl.setAutoCommit(ConnectionImpl.java:2005) <== monitors:1 Thread[#43,ForkJoinPool-1-worker-5,5,CarrierThreads]
> com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:893) <== monitors:1
> com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1061) <== monitors:1
> com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1009) <== monitors:1 Thread[#43,ForkJoinPool-1-worker-5,5,CarrierThreads]
> com.mysql.cj.jdbc.ConnectionImpl.commit(ConnectionImpl.java:791) <== monitors:1 Thread[#43,ForkJoinPool-1-worker-5,5,CarrierThreads]
>
> com.mysql.cj.jdbc.ConnectionImpl.setAutoCommit(ConnectionImpl.java:200
> 5) <== monitors:1
>
> Regards,
>
> William Crowell
>
> From: COURTAULT Francois <[email protected]>
> Date: Monday, November 3, 2025 at 11:05 AM
> To: [email protected] <[email protected]>
> Subject: Tomcat 10 and virtual thread
>
> [You don't often get email from
> [email protected]. Learn why this is
> important at https://aka.ms/LearnAboutSenderIdentification ]
>
> THALES GROUP LIMITED DISTRIBUTION to email recipients
>
> Hello everyone,
>
> Looking at https://tomcat.apache.org/tomcat-10.1-doc/config/executor.html we can configure Tomcat 10.1.x to use virtual threads instead of platform threads. Do you confirm ?
>
> The way to do it, as far as I understood, is to:
>
> * first, declare an executor in server.xml like below
> <Executor name="virtualThread"
>
> className="org.apache.catalina.core.StandardVirtualThreadExecutor" />
>
> * second, use a connector which will refer this above Executor thanks to its name attribute.
> The way I do it, is to update line 74, in server.xml, from <Connector port="8080" protocol="HTTP/1.1" to
> <Connector executor="virtualThread" port="8080" protocol="HTTP/1.1"
>
> I started Tomcat and triggered a thread dump.
> I was not able to see any tomcat-virt string.
> Does it mean that the virtual thread usage is still disabled ?
>
> What's wrong with my configuration ?
>
> Best Regards.
>
>
>
>
>
>
> CAUTION: This email originated from outside of the organization. Do not click on links or open attachments unless you recognize the sender and know the content is safe.
>
>
> This e-mail may contain information that is privileged or confidential. If you are not the intended recipient, please delete the e-mail and any attachments and notify us immediately.
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
>
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]