This is an automated email from the ASF dual-hosted git repository.
jamesnetherton pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git
The following commit(s) were added to refs/heads/main by this push:
new 57da99def4 Add test coverage for virtual thread support
57da99def4 is described below
commit 57da99def42612c9048807fdd04c135f8e476aac
Author: James Netherton <[email protected]>
AuthorDate: Tue May 12 09:52:34 2026 +0100
Add test coverage for virtual thread support
Fixes #8525
---
.../quarkus/core/deployment/CamelProcessor.java | 10 +++++++
.../core/graal/ThreadTypeSubstitutions.java | 32 +++++++++-------------
.../quarkus/component/seda/it/SedaResource.java | 2 +-
.../quarkus/component/seda/it/SedaRoutes.java} | 31 ++++++++++-----------
.../seda/src/main/resources/application.properties | 17 ++++++++++++
.../camel/quarkus/component/seda/it/SedaTest.java | 14 ++++++++++
.../{SedaTest.java => SedaVirtualThreadsIT.java} | 24 ++++++----------
.../{SedaTest.java => SedaVirtualThreadsTest.java} | 30 +++++++++++++++-----
8 files changed, 101 insertions(+), 59 deletions(-)
diff --git
a/extensions-core/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelProcessor.java
b/extensions-core/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelProcessor.java
index 941b4d092f..3d1b78660f 100644
---
a/extensions-core/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelProcessor.java
+++
b/extensions-core/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelProcessor.java
@@ -42,6 +42,7 @@ import io.quarkus.deployment.annotations.Overridable;
import io.quarkus.deployment.annotations.Record;
import io.quarkus.deployment.builditem.ApplicationArchivesBuildItem;
import io.quarkus.deployment.builditem.CombinedIndexBuildItem;
+import io.quarkus.deployment.builditem.SystemPropertyBuildItem;
import
io.quarkus.deployment.builditem.nativeimage.NativeImageResourceBuildItem;
import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem;
import io.quarkus.deployment.pkg.steps.NativeOrNativeSourcesBuild;
@@ -77,6 +78,7 @@ import
org.apache.camel.quarkus.core.deployment.util.PathFilter;
import org.apache.camel.quarkus.core.util.FileUtils;
import org.apache.camel.spi.TypeConverterLoader;
import org.apache.camel.spi.TypeConverterRegistry;
+import org.eclipse.microprofile.config.ConfigProvider;
import org.jboss.jandex.AnnotationTarget;
import org.jboss.jandex.ClassInfo;
import org.jboss.jandex.DotName;
@@ -509,6 +511,14 @@ class CamelProcessor {
return new
CamelModelReifierFactoryBuildItem(recorder.modelReifierFactory());
}
+ @BuildStep
+ public SystemPropertyBuildItem camelVirtualThreadSupportSystemProperty() {
+ // Need to set camel.threads.virtual.enabled early as possible as the
CamelContext is constructed during static init phase
+ return new SystemPropertyBuildItem("camel.threads.virtual.enabled",
ConfigProvider.getConfig()
+ .getOptionalValue("camel.main.virtualThreadsEnabled",
String.class)
+ .orElse("false"));
+ }
+
/**
* Useful for identifying Camel services that are potentially not covered
by inclusion patterns
*/
diff --git
a/integration-test-groups/foundation/seda/src/test/java/org/apache/camel/quarkus/component/seda/it/SedaTest.java
b/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/graal/ThreadTypeSubstitutions.java
similarity index 58%
copy from
integration-test-groups/foundation/seda/src/test/java/org/apache/camel/quarkus/component/seda/it/SedaTest.java
copy to
extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/graal/ThreadTypeSubstitutions.java
index 9f4904b685..80d586c814 100644
---
a/integration-test-groups/foundation/seda/src/test/java/org/apache/camel/quarkus/component/seda/it/SedaTest.java
+++
b/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/graal/ThreadTypeSubstitutions.java
@@ -14,25 +14,19 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.camel.quarkus.component.seda.it;
+package org.apache.camel.quarkus.core.graal;
-import io.quarkus.test.junit.QuarkusTest;
-import io.restassured.RestAssured;
-import io.restassured.http.ContentType;
-import org.junit.jupiter.api.Test;
-
-import static org.hamcrest.Matchers.equalTo;
-
-@QuarkusTest
-class SedaTest {
-
- @Test
- public void seda() {
- RestAssured.given()
- .contentType(ContentType.TEXT).body("Hello
World").post("/seda/foo")
- .then().statusCode(201);
-
- RestAssured.get("/seda/foo").then().body(equalTo("Hello
World")).statusCode(200);
- }
+import com.oracle.svm.core.annotate.Alias;
+import com.oracle.svm.core.annotate.RecomputeFieldValue;
+import com.oracle.svm.core.annotate.TargetClass;
+import org.apache.camel.util.concurrent.ThreadType;
+/**
+ * Prevent Camel virtual thread configuration being set permanently fixed
value in the native application
+ */
+@TargetClass(ThreadType.class)
+final class ThreadTypeSubstitutions {
+ @Alias
+ @RecomputeFieldValue(kind = RecomputeFieldValue.Kind.FromAlias)
+ private static volatile ThreadType current = null;
}
diff --git
a/integration-test-groups/foundation/seda/src/main/java/org/apache/camel/quarkus/component/seda/it/SedaResource.java
b/integration-test-groups/foundation/seda/src/main/java/org/apache/camel/quarkus/component/seda/it/SedaResource.java
index 4e9570d803..6850ce8612 100644
---
a/integration-test-groups/foundation/seda/src/main/java/org/apache/camel/quarkus/component/seda/it/SedaResource.java
+++
b/integration-test-groups/foundation/seda/src/main/java/org/apache/camel/quarkus/component/seda/it/SedaResource.java
@@ -48,7 +48,7 @@ public class SedaResource {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String get(@PathParam("name") String name) throws Exception {
- final String message = consumerTemplate.receiveBodyNoWait("seda:" +
name, String.class);
+ final String message = consumerTemplate.receiveBody("seda:" + name,
5000, String.class);
LOG.infof("Received from seda: %s", message);
return message;
}
diff --git
a/integration-test-groups/foundation/seda/src/test/java/org/apache/camel/quarkus/component/seda/it/SedaTest.java
b/integration-test-groups/foundation/seda/src/main/java/org/apache/camel/quarkus/component/seda/it/SedaRoutes.java
similarity index 56%
copy from
integration-test-groups/foundation/seda/src/test/java/org/apache/camel/quarkus/component/seda/it/SedaTest.java
copy to
integration-test-groups/foundation/seda/src/main/java/org/apache/camel/quarkus/component/seda/it/SedaRoutes.java
index 9f4904b685..b8f14cb691 100644
---
a/integration-test-groups/foundation/seda/src/test/java/org/apache/camel/quarkus/component/seda/it/SedaTest.java
+++
b/integration-test-groups/foundation/seda/src/main/java/org/apache/camel/quarkus/component/seda/it/SedaRoutes.java
@@ -16,23 +16,20 @@
*/
package org.apache.camel.quarkus.component.seda.it;
-import io.quarkus.test.junit.QuarkusTest;
-import io.restassured.RestAssured;
-import io.restassured.http.ContentType;
-import org.junit.jupiter.api.Test;
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.builder.RouteBuilder;
-import static org.hamcrest.Matchers.equalTo;
-
-@QuarkusTest
-class SedaTest {
-
- @Test
- public void seda() {
- RestAssured.given()
- .contentType(ContentType.TEXT).body("Hello
World").post("/seda/foo")
- .then().statusCode(201);
-
- RestAssured.get("/seda/foo").then().body(equalTo("Hello
World")).statusCode(200);
+public class SedaRoutes extends RouteBuilder {
+ @Override
+ public void configure() throws Exception {
+ from("seda:virtualThreaded")
+ .process(new Processor() {
+ public void process(Exchange exchange) throws Exception {
+ // Avoid Thread.isVirtual to maintain JDK 17
compatibility
+
exchange.getMessage().setBody(Thread.currentThread().getClass().getName());
+ }
+ })
+ .to("seda:virtualThreadedResults");
}
-
}
diff --git
a/integration-test-groups/foundation/seda/src/main/resources/application.properties
b/integration-test-groups/foundation/seda/src/main/resources/application.properties
new file mode 100644
index 0000000000..ecf18b08b7
--- /dev/null
+++
b/integration-test-groups/foundation/seda/src/main/resources/application.properties
@@ -0,0 +1,17 @@
+## ---------------------------------------------------------------------------
+## Licensed to the Apache Software Foundation (ASF) under one or more
+## contributor license agreements. See the NOTICE file distributed with
+## this work for additional information regarding copyright ownership.
+## The ASF licenses this file to You under the Apache License, Version 2.0
+## (the "License"); you may not use this file except in compliance with
+## the License. You may obtain a copy of the License at
+##
+## http://www.apache.org/licenses/LICENSE-2.0
+##
+## Unless required by applicable law or agreed to in writing, software
+## distributed under the License is distributed on an "AS IS" BASIS,
+## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+## See the License for the specific language governing permissions and
+## limitations under the License.
+## ---------------------------------------------------------------------------
+%virtualThreads.camel.main.virtualThreadsEnabled=true
\ No newline at end of file
diff --git
a/integration-test-groups/foundation/seda/src/test/java/org/apache/camel/quarkus/component/seda/it/SedaTest.java
b/integration-test-groups/foundation/seda/src/test/java/org/apache/camel/quarkus/component/seda/it/SedaTest.java
index 9f4904b685..5e1df50b97 100644
---
a/integration-test-groups/foundation/seda/src/test/java/org/apache/camel/quarkus/component/seda/it/SedaTest.java
+++
b/integration-test-groups/foundation/seda/src/test/java/org/apache/camel/quarkus/component/seda/it/SedaTest.java
@@ -22,6 +22,7 @@ import io.restassured.http.ContentType;
import org.junit.jupiter.api.Test;
import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.is;
@QuarkusTest
class SedaTest {
@@ -35,4 +36,17 @@ class SedaTest {
RestAssured.get("/seda/foo").then().body(equalTo("Hello
World")).statusCode(200);
}
+ @Test
+ void virtualThreadsDisabled() {
+ RestAssured.given()
+ .contentType(ContentType.TEXT)
+ .post("/seda/virtualThreaded")
+ .then()
+ .statusCode(201);
+
+ RestAssured.get("/seda/virtualThreadedResults")
+ .then()
+ .body(is(Thread.class.getName()))
+ .statusCode(200);
+ }
}
diff --git
a/integration-test-groups/foundation/seda/src/test/java/org/apache/camel/quarkus/component/seda/it/SedaTest.java
b/integration-test-groups/foundation/seda/src/test/java/org/apache/camel/quarkus/component/seda/it/SedaVirtualThreadsIT.java
similarity index 66%
copy from
integration-test-groups/foundation/seda/src/test/java/org/apache/camel/quarkus/component/seda/it/SedaTest.java
copy to
integration-test-groups/foundation/seda/src/test/java/org/apache/camel/quarkus/component/seda/it/SedaVirtualThreadsIT.java
index 9f4904b685..7920405eab 100644
---
a/integration-test-groups/foundation/seda/src/test/java/org/apache/camel/quarkus/component/seda/it/SedaTest.java
+++
b/integration-test-groups/foundation/seda/src/test/java/org/apache/camel/quarkus/component/seda/it/SedaVirtualThreadsIT.java
@@ -16,23 +16,17 @@
*/
package org.apache.camel.quarkus.component.seda.it;
-import io.quarkus.test.junit.QuarkusTest;
-import io.restassured.RestAssured;
-import io.restassured.http.ContentType;
+import io.quarkus.test.junit.QuarkusIntegrationTest;
import org.junit.jupiter.api.Test;
-import static org.hamcrest.Matchers.equalTo;
-
-@QuarkusTest
-class SedaTest {
-
+@QuarkusIntegrationTest
+class SedaVirtualThreadsIT extends SedaVirtualThreadsTest {
+ /**
+ * Overridden to remove JDK version restrictions as the JDK used in native
mode should be >= 25
+ */
+ @Override
@Test
- public void seda() {
- RestAssured.given()
- .contentType(ContentType.TEXT).body("Hello
World").post("/seda/foo")
- .then().statusCode(201);
-
- RestAssured.get("/seda/foo").then().body(equalTo("Hello
World")).statusCode(200);
+ void sedaExecutesOnVirtualThread() {
+ super.sedaExecutesOnVirtualThread();
}
-
}
diff --git
a/integration-test-groups/foundation/seda/src/test/java/org/apache/camel/quarkus/component/seda/it/SedaTest.java
b/integration-test-groups/foundation/seda/src/test/java/org/apache/camel/quarkus/component/seda/it/SedaVirtualThreadsTest.java
similarity index 52%
copy from
integration-test-groups/foundation/seda/src/test/java/org/apache/camel/quarkus/component/seda/it/SedaTest.java
copy to
integration-test-groups/foundation/seda/src/test/java/org/apache/camel/quarkus/component/seda/it/SedaVirtualThreadsTest.java
index 9f4904b685..5a575f8e3c 100644
---
a/integration-test-groups/foundation/seda/src/test/java/org/apache/camel/quarkus/component/seda/it/SedaTest.java
+++
b/integration-test-groups/foundation/seda/src/test/java/org/apache/camel/quarkus/component/seda/it/SedaVirtualThreadsTest.java
@@ -17,22 +17,38 @@
package org.apache.camel.quarkus.component.seda.it;
import io.quarkus.test.junit.QuarkusTest;
+import io.quarkus.test.junit.QuarkusTestProfile;
+import io.quarkus.test.junit.TestProfile;
import io.restassured.RestAssured;
import io.restassured.http.ContentType;
import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.condition.EnabledForJreRange;
+import org.junit.jupiter.api.condition.JRE;
-import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.containsString;
+@TestProfile(SedaVirtualThreadsTest.VirtualThreadsTestProfile.class)
@QuarkusTest
-class SedaTest {
-
+class SedaVirtualThreadsTest {
+ @EnabledForJreRange(min = JRE.JAVA_21)
@Test
- public void seda() {
+ void sedaExecutesOnVirtualThread() {
RestAssured.given()
- .contentType(ContentType.TEXT).body("Hello
World").post("/seda/foo")
- .then().statusCode(201);
+ .contentType(ContentType.TEXT)
+ .post("/seda/virtualThreaded")
+ .then()
+ .statusCode(201);
- RestAssured.get("/seda/foo").then().body(equalTo("Hello
World")).statusCode(200);
+ RestAssured.get("/seda/virtualThreadedResults")
+ .then()
+ .body(containsString("java.lang.VirtualThread"))
+ .statusCode(200);
}
+ public static final class VirtualThreadsTestProfile implements
QuarkusTestProfile {
+ @Override
+ public String getConfigProfile() {
+ return "virtualThreads";
+ }
+ }
}