diff --git a/docs/src/main/asciidoc/virtual-threads.adoc b/docs/src/main/asciidoc/virtual-threads.adoc index 0183f7c38c262..98ccd0c0ad187 100644 --- a/docs/src/main/asciidoc/virtual-threads.adoc +++ b/docs/src/main/asciidoc/virtual-threads.adoc @@ -434,7 +434,7 @@ However, thread locals are not propagated. == Virtual thread names Virtual threads are created without a thread name by default, which is not practical to identify the execution for debugging and logging purposes. -Quarkus managed virtual threads are named and prefixed with `quarkus-virtual-thread-`. +Quarkus managed virtual threads are named with `quarkus-virtual-thread`. You can customize this prefix, or disable the naming altogether configuring an empty value: [source, properties] diff --git a/extensions/virtual-threads/runtime/src/main/java/io/quarkus/virtual/threads/VirtualThreadsConfig.java b/extensions/virtual-threads/runtime/src/main/java/io/quarkus/virtual/threads/VirtualThreadsConfig.java index 3c5537838182b..b8f6b35ac7ac2 100644 --- a/extensions/virtual-threads/runtime/src/main/java/io/quarkus/virtual/threads/VirtualThreadsConfig.java +++ b/extensions/virtual-threads/runtime/src/main/java/io/quarkus/virtual/threads/VirtualThreadsConfig.java @@ -13,9 +13,9 @@ public interface VirtualThreadsConfig { /** - * Virtual thread name prefix. The name of the virtual thread will be the prefix followed by a unique number. + * Virtual thread name. The name of the virtual thread will be the prefix. */ - @WithDefault("quarkus-virtual-thread-") + @WithDefault("quarkus-virtual-thread") Optional namePrefix(); /** diff --git a/extensions/virtual-threads/runtime/src/main/java/io/quarkus/virtual/threads/VirtualThreadsRecorder.java b/extensions/virtual-threads/runtime/src/main/java/io/quarkus/virtual/threads/VirtualThreadsRecorder.java index fbfdf1dfd03aa..6e0dfc78d5f98 100644 --- a/extensions/virtual-threads/runtime/src/main/java/io/quarkus/virtual/threads/VirtualThreadsRecorder.java +++ b/extensions/virtual-threads/runtime/src/main/java/io/quarkus/virtual/threads/VirtualThreadsRecorder.java @@ -117,8 +117,10 @@ static ExecutorService newVirtualThreadPerTaskExecutorWithName(String prefix) Class vtbClass = Class.forName("java.lang.Thread$Builder$OfVirtual"); // .name() if (prefix != null) { - Method name = vtbClass.getMethod("name", String.class, long.class); - vtb = name.invoke(vtb, prefix, 0); + // why this is not using name(prefix, 0)? + // see https://bugs.openjdk.org/browse/JDK-8372410 + Method name = vtbClass.getMethod("name", String.class); + vtb = name.invoke(vtb, prefix); } // .uncaughtExceptionHandler() Method uncaughtHandler = vtbClass.getMethod("uncaughtExceptionHandler", Thread.UncaughtExceptionHandler.class); diff --git a/extensions/websockets-next/deployment/src/test/java21/io/quarkus/websockets/next/test/virtualthreads/RunOnVirtualThreadTest.java b/extensions/websockets-next/deployment/src/test/java21/io/quarkus/websockets/next/test/virtualthreads/RunOnVirtualThreadTest.java index 80676788b7dbf..22f298a4d7f8c 100644 --- a/extensions/websockets-next/deployment/src/test/java21/io/quarkus/websockets/next/test/virtualthreads/RunOnVirtualThreadTest.java +++ b/extensions/websockets-next/deployment/src/test/java21/io/quarkus/websockets/next/test/virtualthreads/RunOnVirtualThreadTest.java @@ -29,7 +29,7 @@ public class RunOnVirtualThreadTest { .withApplicationRoot(root -> { root.addClasses(Endpoint.class, WSClient.class, RequestScopedBean.class) .addAsResource(new StringAsset( - "quarkus.virtual-threads.name-prefix=wsnext-virtual-thread-"), + "quarkus.virtual-threads.name-prefix=wsnext-virtual-thread"), "application.properties"); }); @@ -82,7 +82,7 @@ public static class Endpoint { @OnTextMessage String text(String ignored) { VirtualThreadsAssertions.assertEverything(); - return Thread.currentThread().getName(); + return Thread.currentThread().getName() + '-' + Thread.currentThread().getId(); } @OnError @@ -102,13 +102,13 @@ public static class EndpointVirtOnClass { @OnOpen String open() { VirtualThreadsAssertions.assertEverything(); - return Thread.currentThread().getName(); + return Thread.currentThread().getName() + '-' + Thread.currentThread().getId(); } @OnTextMessage String text(String ignored) { VirtualThreadsAssertions.assertEverything(); - return Thread.currentThread().getName(); + return Thread.currentThread().getName() + '-' + Thread.currentThread().getId(); } } diff --git a/integration-tests/virtual-threads/metrics-virtual-threads/src/main/java/io/quarkus/virtual/vertx/web/Routes.java b/integration-tests/virtual-threads/metrics-virtual-threads/src/main/java/io/quarkus/virtual/vertx/web/Routes.java index e85a3eaa39f55..88727de86b60b 100644 --- a/integration-tests/virtual-threads/metrics-virtual-threads/src/main/java/io/quarkus/virtual/vertx/web/Routes.java +++ b/integration-tests/virtual-threads/metrics-virtual-threads/src/main/java/io/quarkus/virtual/vertx/web/Routes.java @@ -25,8 +25,8 @@ void assertThatTheBinderIsAvailable() { String hello() { assertThatTheBinderIsAvailable(); VirtualThreadsAssertions.assertEverything(); - // Quarkus specific - each VT has a unique name - return Thread.currentThread().getName(); + // Quarkus specific - all VTs shares the same prefix + return Thread.currentThread().getName() + '-' + Thread.currentThread().getId(); } @Route diff --git a/integration-tests/virtual-threads/metrics-virtual-threads/src/test/java/io/quarkus/virtual/vertx/web/RunOnVirtualThreadTest.java b/integration-tests/virtual-threads/metrics-virtual-threads/src/test/java/io/quarkus/virtual/vertx/web/RunOnVirtualThreadTest.java index 9175d7536ca71..176dc09d87eee 100644 --- a/integration-tests/virtual-threads/metrics-virtual-threads/src/test/java/io/quarkus/virtual/vertx/web/RunOnVirtualThreadTest.java +++ b/integration-tests/virtual-threads/metrics-virtual-threads/src/test/java/io/quarkus/virtual/vertx/web/RunOnVirtualThreadTest.java @@ -2,7 +2,7 @@ import static io.restassured.RestAssured.get; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; import org.junit.jupiter.api.Test; @@ -18,8 +18,9 @@ class RunOnVirtualThreadTest { @Test void testRouteOnVirtualThread() { String bodyStr = get("/hello").then().statusCode(200).extract().asString(); - // Each VT has a unique name in quarkus - assertNotEquals(bodyStr, get("/hello").then().statusCode(200).extract().asString()); + // Quarkus specific - all VTs shares the same prefix + assertTrue(bodyStr.startsWith("quarkus-virtual-thread")); + assertTrue(get("/hello").then().statusCode(200).extract().asString().startsWith("quarkus-virtual-thread")); } @Test diff --git a/integration-tests/virtual-threads/quartz-virtual-threads/src/main/java/io/quarkus/virtual/scheduler/ScheduledResource.java b/integration-tests/virtual-threads/quartz-virtual-threads/src/main/java/io/quarkus/virtual/scheduler/ScheduledResource.java index 143fcf34c1a09..91ab3b94c7858 100644 --- a/integration-tests/virtual-threads/quartz-virtual-threads/src/main/java/io/quarkus/virtual/scheduler/ScheduledResource.java +++ b/integration-tests/virtual-threads/quartz-virtual-threads/src/main/java/io/quarkus/virtual/scheduler/ScheduledResource.java @@ -24,8 +24,8 @@ public void init(@Observes StartupEvent ev, Scheduler scheduler) { .setInterval("1s") .setTask(ex -> { VirtualThreadsAssertions.assertEverything(); - // Quarkus specific - each VT has a unique name - programmaticExecutions.add(Thread.currentThread().getName()); + // Quarkus specific - all VTs shares the same prefix + programmaticExecutions.add(Thread.currentThread().getName() + '-' + Thread.currentThread().getId()); }, true) .schedule(); } @@ -34,8 +34,8 @@ public void init(@Observes StartupEvent ev, Scheduler scheduler) { @RunOnVirtualThread void run() { VirtualThreadsAssertions.assertEverything(); - // Quarkus specific - each VT has a unique name - executions.add(Thread.currentThread().getName()); + // Quarkus specific - all VTs shares the same prefix + executions.add(Thread.currentThread().getName() + '-' + Thread.currentThread().getId()); } @GET diff --git a/integration-tests/virtual-threads/reactive-routes-virtual-threads/src/main/java/io/quarkus/virtual/vertx/web/Routes.java b/integration-tests/virtual-threads/reactive-routes-virtual-threads/src/main/java/io/quarkus/virtual/vertx/web/Routes.java index f9c86e1ffcf06..d2044aaadac90 100644 --- a/integration-tests/virtual-threads/reactive-routes-virtual-threads/src/main/java/io/quarkus/virtual/vertx/web/Routes.java +++ b/integration-tests/virtual-threads/reactive-routes-virtual-threads/src/main/java/io/quarkus/virtual/vertx/web/Routes.java @@ -11,8 +11,8 @@ public class Routes { @Route String hello() { VirtualThreadsAssertions.assertEverything(); - // Quarkus specific - each VT has a unique name - return Thread.currentThread().getName(); + // Quarkus specific - all VTs shares the same prefix + return Thread.currentThread().getName() + '-' + Thread.currentThread().getId(); } @Route diff --git a/integration-tests/virtual-threads/scheduler-virtual-threads/src/main/java/io/quarkus/virtual/scheduler/ScheduledResource.java b/integration-tests/virtual-threads/scheduler-virtual-threads/src/main/java/io/quarkus/virtual/scheduler/ScheduledResource.java index 143fcf34c1a09..91ab3b94c7858 100644 --- a/integration-tests/virtual-threads/scheduler-virtual-threads/src/main/java/io/quarkus/virtual/scheduler/ScheduledResource.java +++ b/integration-tests/virtual-threads/scheduler-virtual-threads/src/main/java/io/quarkus/virtual/scheduler/ScheduledResource.java @@ -24,8 +24,8 @@ public void init(@Observes StartupEvent ev, Scheduler scheduler) { .setInterval("1s") .setTask(ex -> { VirtualThreadsAssertions.assertEverything(); - // Quarkus specific - each VT has a unique name - programmaticExecutions.add(Thread.currentThread().getName()); + // Quarkus specific - all VTs shares the same prefix + programmaticExecutions.add(Thread.currentThread().getName() + '-' + Thread.currentThread().getId()); }, true) .schedule(); } @@ -34,8 +34,8 @@ public void init(@Observes StartupEvent ev, Scheduler scheduler) { @RunOnVirtualThread void run() { VirtualThreadsAssertions.assertEverything(); - // Quarkus specific - each VT has a unique name - executions.add(Thread.currentThread().getName()); + // Quarkus specific - all VTs shares the same prefix + executions.add(Thread.currentThread().getName() + '-' + Thread.currentThread().getId()); } @GET