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