diff --git a/module/spring-boot-jetty/src/main/java/org/springframework/boot/jetty/autoconfigure/JettyVirtualThreadsWebServerFactoryCustomizer.java b/module/spring-boot-jetty/src/main/java/org/springframework/boot/jetty/autoconfigure/JettyVirtualThreadsWebServerFactoryCustomizer.java index 820f1d96dc06..aa5ffc1e47e0 100644 --- a/module/spring-boot-jetty/src/main/java/org/springframework/boot/jetty/autoconfigure/JettyVirtualThreadsWebServerFactoryCustomizer.java +++ b/module/spring-boot-jetty/src/main/java/org/springframework/boot/jetty/autoconfigure/JettyVirtualThreadsWebServerFactoryCustomizer.java @@ -17,6 +17,7 @@ package org.springframework.boot.jetty.autoconfigure; import org.eclipse.jetty.util.VirtualThreads; +import org.eclipse.jetty.util.thread.QueuedThreadPool; import org.eclipse.jetty.util.thread.VirtualThreadPool; import org.jspecify.annotations.Nullable; @@ -61,11 +62,15 @@ public JettyVirtualThreadsWebServerFactoryCustomizer(JettyServerProperties serve @Override public void customize(ConfigurableJettyWebServerFactory factory) { Assert.state(VirtualThreads.areSupported(), "Virtual threads are not supported"); + JettyServerProperties.Threads threadProperties = (this.serverProperties != null) + ? this.serverProperties.getThreads() : new JettyServerProperties.Threads(); Integer maxTasks = getMaxTasks(); VirtualThreadPool virtualThreadPool = (maxTasks != null) ? new VirtualThreadPool(maxTasks) : new VirtualThreadPool(); virtualThreadPool.setName("jetty-"); - factory.setThreadPool(virtualThreadPool); + QueuedThreadPool threadPool = JettyThreadPool.create(threadProperties); + threadPool.setVirtualThreadsExecutor(virtualThreadPool); + factory.setThreadPool(threadPool); } private @Nullable Integer getMaxTasks() { diff --git a/module/spring-boot-jetty/src/test/java/org/springframework/boot/jetty/autoconfigure/JettyVirtualThreadsWebServerFactoryCustomizerTests.java b/module/spring-boot-jetty/src/test/java/org/springframework/boot/jetty/autoconfigure/JettyVirtualThreadsWebServerFactoryCustomizerTests.java index 06e01be448bf..41cbc7430d76 100644 --- a/module/spring-boot-jetty/src/test/java/org/springframework/boot/jetty/autoconfigure/JettyVirtualThreadsWebServerFactoryCustomizerTests.java +++ b/module/spring-boot-jetty/src/test/java/org/springframework/boot/jetty/autoconfigure/JettyVirtualThreadsWebServerFactoryCustomizerTests.java @@ -16,6 +16,7 @@ package org.springframework.boot.jetty.autoconfigure; +import org.eclipse.jetty.util.thread.QueuedThreadPool; import org.eclipse.jetty.util.thread.VirtualThreadPool; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledForJreRange; @@ -45,8 +46,11 @@ void shouldConfigureVirtualThreads() { ConfigurableJettyWebServerFactory factory = mock(ConfigurableJettyWebServerFactory.class); customizer.customize(factory); then(factory).should().setThreadPool(assertArg((threadPool) -> { - assertThat(threadPool).isInstanceOf(VirtualThreadPool.class); - VirtualThreadPool virtualThreadPool = (VirtualThreadPool) threadPool; + assertThat(threadPool).isInstanceOf(QueuedThreadPool.class); + QueuedThreadPool queuedThreadPool = (QueuedThreadPool) threadPool; + assertThat(queuedThreadPool.getMaxThreads()).isEqualTo(100); + assertThat(queuedThreadPool.getVirtualThreadsExecutor()).isInstanceOf(VirtualThreadPool.class); + VirtualThreadPool virtualThreadPool = (VirtualThreadPool) queuedThreadPool.getVirtualThreadsExecutor(); assertThat(virtualThreadPool.getName()).isEqualTo("jetty-"); assertThat(virtualThreadPool.getMaxConcurrentTasks()).isEqualTo(100); }));