You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ja...@apache.org on 2025/08/11 08:19:16 UTC
(camel-quarkus) branch main updated: [fixes #7054] Remove workaround for management dumpRoutesStatsAsXml and dumpStepStatsAsXml
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 52df314638 [fixes #7054] Remove workaround for management dumpRoutesStatsAsXml and dumpStepStatsAsXml
52df314638 is described below
commit 52df314638a645efd990dc4153fefe0f0c8add41
Author: Lukas Lowinger <ll...@redhat.com>
AuthorDate: Mon Aug 11 10:19:11 2025 +0200
[fixes #7054] Remove workaround for management dumpRoutesStatsAsXml and dumpStepStatsAsXml
---
.../management/deployment/ManagementProcessor.java | 14 ++-----
.../management/it/ManagementResource.java | 28 ++++++++++++++
.../quarkus/component/management/it/Routes.java | 17 +++++++++
.../component/management/it/ManagementTest.java | 43 ++++++++++++++++++++++
4 files changed, 91 insertions(+), 11 deletions(-)
diff --git a/extensions/management/deployment/src/main/java/org/apache/camel/quarkus/component/management/deployment/ManagementProcessor.java b/extensions/management/deployment/src/main/java/org/apache/camel/quarkus/component/management/deployment/ManagementProcessor.java
index 0c8986c1ef..f1117f0746 100644
--- a/extensions/management/deployment/src/main/java/org/apache/camel/quarkus/component/management/deployment/ManagementProcessor.java
+++ b/extensions/management/deployment/src/main/java/org/apache/camel/quarkus/component/management/deployment/ManagementProcessor.java
@@ -20,7 +20,6 @@ import java.io.NotSerializableException;
import java.io.ObjectStreamException;
import java.lang.reflect.Modifier;
import java.rmi.NotBoundException;
-import java.util.Collections;
import java.util.Objects;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
@@ -47,12 +46,9 @@ import io.quarkus.deployment.annotations.Record;
import io.quarkus.deployment.builditem.CombinedIndexBuildItem;
import io.quarkus.deployment.builditem.FeatureBuildItem;
import io.quarkus.deployment.builditem.NativeMonitoringBuildItem;
-import io.quarkus.deployment.builditem.RemovedResourceBuildItem;
import io.quarkus.deployment.builditem.nativeimage.NativeImageProxyDefinitionBuildItem;
import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem;
import io.quarkus.deployment.pkg.NativeConfig;
-import io.quarkus.deployment.pkg.steps.NativeOrNativeSourcesBuild;
-import io.quarkus.maven.dependency.ArtifactKey;
import jakarta.transaction.NotSupportedException;
import org.apache.camel.RuntimeCamelException;
import org.apache.camel.RuntimeExchangeException;
@@ -61,6 +57,7 @@ import org.apache.camel.api.management.ManagedNotification;
import org.apache.camel.api.management.ManagedNotifications;
import org.apache.camel.api.management.ManagedOperation;
import org.apache.camel.api.management.ManagedResource;
+import org.apache.camel.api.management.mbean.ManagedStepMBean;
import org.apache.camel.quarkus.component.management.CamelManagementRecorder;
import org.apache.camel.quarkus.core.deployment.spi.CamelSerializationBuildItem;
import org.apache.camel.quarkus.core.deployment.spi.RuntimeCamelContextCustomizerBuildItem;
@@ -123,6 +120,8 @@ class ManagementProcessor {
// Find Camel management interfaces and configure native proxy definitions for them
Set<String> managedBeanInterfaces = getManagedTypes(index, classInfo -> Modifier.isInterface(classInfo.flags()));
+ // ManagedStepMBean doesn't have any annotation
+ managedBeanInterfaces.add(ManagedStepMBean.class.getName());
managedBeanInterfaces.stream()
.map(NativeImageProxyDefinitionBuildItem::new)
.forEach(nativeImageProxy::produce);
@@ -161,13 +160,6 @@ class ManagementProcessor {
return new NativeMonitoringBuildItem(NativeConfig.MonitoringOption.JMXSERVER);
}
- // TODO: Remove this https://github.com/apache/camel-quarkus/issues/7054
- @BuildStep(onlyIf = NativeOrNativeSourcesBuild.class)
- RemovedResourceBuildItem removedResources() {
- return new RemovedResourceBuildItem(ArtifactKey.fromString("io.quarkus:quarkus-core"),
- Collections.singleton("io/quarkus/runtime/graal/Target_javax_management_JMX.class"));
- }
-
private Set<String> getManagedTypes(IndexView index, Predicate<ClassInfo> typeFilter) {
return Stream.of(CAMEL_MANAGEMENT_ANNOTATIONS)
.flatMap(annotation -> index.getAnnotations(annotation).stream())
diff --git a/integration-tests/management/src/main/java/org/apache/camel/quarkus/component/management/it/ManagementResource.java b/integration-tests/management/src/main/java/org/apache/camel/quarkus/component/management/it/ManagementResource.java
index 518ef10846..23d6df506b 100644
--- a/integration-tests/management/src/main/java/org/apache/camel/quarkus/component/management/it/ManagementResource.java
+++ b/integration-tests/management/src/main/java/org/apache/camel/quarkus/component/management/it/ManagementResource.java
@@ -18,6 +18,7 @@ package org.apache.camel.quarkus.component.management.it;
import java.lang.management.ManagementFactory;
import java.util.Iterator;
+import java.util.List;
import java.util.Set;
import javax.management.MBeanServer;
@@ -77,6 +78,33 @@ public class ManagementResource {
return null;
}
+ @POST
+ @Path("/invokeXml")
+ @Produces(MediaType.APPLICATION_XML)
+ public String invokeMBeanXmlOperation(@QueryParam("name") String name, @QueryParam("operation") String operation,
+ @QueryParam("paramValues") List<String> paramValues, @QueryParam("paramTypes") List<String> paramTypes)
+ throws Exception {
+ Object[] values = new Object[paramValues.size()];
+ String[] types = new String[paramTypes.size()];
+
+ for (int i = 0; i < paramValues.size(); i++) {
+ String valueStr = paramValues.get(i);
+ String typeStr = paramTypes.get(i);
+
+ switch (typeStr) {
+ case "boolean":
+ values[i] = Boolean.parseBoolean(valueStr);
+ break;
+ }
+ types[i] = typeStr;
+ }
+ ObjectInstance mbean = getMBean(name);
+ if (mbean != null) {
+ return String.valueOf(getMBeanServer().invoke(mbean.getObjectName(), operation, values, types));
+ }
+ return null;
+ }
+
@POST
@Path("/invoke/route")
public String invokeRoute(@QueryParam("endpointUri") String endpointUri) {
diff --git a/integration-tests/management/src/main/java/org/apache/camel/quarkus/component/management/it/Routes.java b/integration-tests/management/src/main/java/org/apache/camel/quarkus/component/management/it/Routes.java
index 9b57e78a6b..bb0582981c 100644
--- a/integration-tests/management/src/main/java/org/apache/camel/quarkus/component/management/it/Routes.java
+++ b/integration-tests/management/src/main/java/org/apache/camel/quarkus/component/management/it/Routes.java
@@ -16,6 +16,8 @@
*/
package org.apache.camel.quarkus.component.management.it;
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
import org.apache.camel.builder.RouteBuilder;
public class Routes extends RouteBuilder {
@@ -25,6 +27,21 @@ public class Routes extends RouteBuilder {
from("direct:start").routeId("hello").setBody().constant("Hello World");
+ from("direct:step").routeId("hellostep").step("hellostep")
+ .doTry()
+ .setBody().constant("Hello Step")
+ .process(new Processor() {
+ @Override
+ public void process(Exchange exchange) throws Exception {
+ // not used processor, just to be able to call `doFinally`
+ }
+ })
+ .doFinally()
+ .id("trystep")
+ .end()
+ .stop()
+ .id("stopstep");
+
from("direct:count").routeId("count")
.bean(ManagedCounter.class, "increment").id("counter");
diff --git a/integration-tests/management/src/test/java/org/apache/camel/quarkus/component/management/it/ManagementTest.java b/integration-tests/management/src/test/java/org/apache/camel/quarkus/component/management/it/ManagementTest.java
index 1c5c944132..15cbd25c12 100644
--- a/integration-tests/management/src/test/java/org/apache/camel/quarkus/component/management/it/ManagementTest.java
+++ b/integration-tests/management/src/test/java/org/apache/camel/quarkus/component/management/it/ManagementTest.java
@@ -18,6 +18,7 @@ package org.apache.camel.quarkus.component.management.it;
import java.io.IOException;
import java.net.Socket;
+import java.util.List;
import io.quarkus.test.junit.QuarkusTest;
import io.restassured.RestAssured;
@@ -27,6 +28,7 @@ import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.is;
import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -68,6 +70,47 @@ class ManagementTest {
.body(containsString("uri=\"direct:start\""));
}
+ @ParameterizedTest
+ @ValueSource(strings = { "stopstep", "trystep" })
+ public void testProcessorAsXml(String processorId) {
+ RestAssured.given()
+ .queryParam("name",
+ "org.apache.camel:*,type=processors,name=\"%s\"".formatted(processorId))
+ .queryParam("operation", "dumpProcessorAsXml")
+ .post("/management/invoke")
+ .then()
+ .statusCode(200)
+ .body(containsString("id=\"%s\"".formatted(processorId)));
+ }
+
+ @Test
+ public void testDumpStepStatsAsXml() {
+ RestAssured.given()
+ .queryParam("name", "org.apache.camel:*,type=routes,name=\"hellostep\"")
+ .queryParam("operation", "dumpStepStatsAsXml")
+ .queryParam("paramTypes", List.of("boolean"))
+ .queryParam("paramValues", List.of("true"))
+ .post("/management/invokeXml")
+ .then()
+ .statusCode(200)
+ .body("routeStat.stepStats.stepStat.find { it.@id == 'hellostep' }.@state", equalTo("Started"));
+ }
+
+ @Test
+ public void testDumpRoutesStatsAsXml() {
+ RestAssured.given()
+ .queryParam("name", "org.apache.camel:type=context,*")
+ .queryParam("operation", "dumpRoutesStatsAsXml")
+ .queryParam("paramTypes", List.of("boolean", "boolean"))
+ .queryParam("paramValues", List.of("false", "true"))
+ .post("/management/invokeXml")
+ .then()
+ .statusCode(200)
+ .body("camelContextStat.routeStats.routeStat.find { it.@id == 'hello' }.@state", equalTo("Started"))
+ .body("camelContextStat.routeStats.routeStat.find { it.@id == 'dataformat' }.processorStats.processorStat[1].@id",
+ containsString("marshal"));
+ }
+
@Test
public void testUpdateRoute() {
// Modify the hello route