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]

Reply via email to