You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by nf...@apache.org on 2023/07/05 12:47:16 UTC

[camel-quarkus] 01/01: Improve native support of camel-quarkus-debug

This is an automated email from the ASF dual-hosted git repository.

nfilotto pushed a commit to branch improve-native-support-of-camel-quarkus-debug
in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git

commit 0eecb892e0962c52ec0233c7cb714ac63eb98221
Author: Nicolas Filotto <nf...@talend.com>
AuthorDate: Wed Jul 5 14:46:19 2023 +0200

    Improve native support of camel-quarkus-debug
---
 .../ROOT/pages/reference/extensions/debug.adoc     |  6 +++++
 .../component/debug/deployment/DebugProcessor.java | 22 +++++++++++++++
 .../camel/quarkus/component/debug/DebugConfig.java |  6 +++++
 integration-tests/debug/pom.xml                    | 17 ++++++++++++
 .../quarkus/component/debug/it/DebugRoutes.java    | 21 ++++++++-------
 .../quarkus/component/debug/it/DebugTest.java      | 31 ++++++++++++++++++++++
 6 files changed, 94 insertions(+), 9 deletions(-)

diff --git a/docs/modules/ROOT/pages/reference/extensions/debug.adoc b/docs/modules/ROOT/pages/reference/extensions/debug.adoc
index a04a415908..ed615bd06a 100644
--- a/docs/modules/ROOT/pages/reference/extensions/debug.adoc
+++ b/docs/modules/ROOT/pages/reference/extensions/debug.adoc
@@ -80,6 +80,12 @@ quarkus.camel.debug.enabled=true
 |icon:lock[title=Fixed at build time] [[quarkus.camel.debug.enabled]]`link:#quarkus.camel.debug.enabled[quarkus.camel.debug.enabled]`
 
 
+| `boolean`
+| `false`
+
+|icon:lock[title=Fixed at build time] [[quarkus.camel.debug.suspend]]`link:#quarkus.camel.debug.suspend[quarkus.camel.debug.suspend]`
+
+
 | `boolean`
 | `false`
 |===
diff --git a/extensions/debug/deployment/src/main/java/org/apache/camel/quarkus/component/debug/deployment/DebugProcessor.java b/extensions/debug/deployment/src/main/java/org/apache/camel/quarkus/component/debug/deployment/DebugProcessor.java
index 24c84cd13e..a06c7afd39 100644
--- a/extensions/debug/deployment/src/main/java/org/apache/camel/quarkus/component/debug/deployment/DebugProcessor.java
+++ b/extensions/debug/deployment/src/main/java/org/apache/camel/quarkus/component/debug/deployment/DebugProcessor.java
@@ -16,11 +16,16 @@
  */
 package org.apache.camel.quarkus.component.debug.deployment;
 
+import java.util.HashSet;
+import java.util.LinkedHashSet;
 import java.util.function.BooleanSupplier;
 
+import io.quarkus.deployment.annotations.BuildProducer;
 import io.quarkus.deployment.annotations.BuildStep;
 import io.quarkus.deployment.builditem.AllowJNDIBuildItem;
 import io.quarkus.deployment.builditem.FeatureBuildItem;
+import io.quarkus.deployment.builditem.SystemPropertyBuildItem;
+import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem;
 import io.quarkus.runtime.LaunchMode;
 import org.apache.camel.quarkus.component.debug.DebugConfig;
 import org.apache.camel.quarkus.core.deployment.spi.CamelServiceDestination;
@@ -28,6 +33,12 @@ import org.apache.camel.quarkus.core.deployment.spi.CamelServicePatternBuildItem
 import org.eclipse.microprofile.config.ConfigProvider;
 
 class DebugProcessor {
+
+    private static final String[] SERIALIZATION_CLASSES = {
+            HashSet.class.getName(),
+            LinkedHashSet.class.getName(),
+    };
+
     private static final String FEATURE = "camel-debug";
 
     @BuildStep(onlyIf = DebugEnabled.class)
@@ -48,6 +59,17 @@ class DebugProcessor {
                 "META-INF/services/org/apache/camel/debugger-factory");
     }
 
+    @BuildStep(onlyIf = DebugEnabled.class)
+    void configureSystemProperties(BuildProducer<SystemPropertyBuildItem> producer, DebugConfig config) {
+        producer.produce(new SystemPropertyBuildItem("org.apache.camel.debugger.suspend", Boolean.toString(config.suspend)));
+        producer.produce(new SystemPropertyBuildItem("org.apache.camel.jmx.disabled", "false"));
+    }
+
+    @BuildStep
+    void configureReflection(BuildProducer<ReflectiveClassBuildItem> reflectiveClass) {
+        reflectiveClass.produce(ReflectiveClassBuildItem.builder(SERIALIZATION_CLASSES).serialization().build());
+    }
+
     static class DebugEnabled implements BooleanSupplier {
         DebugConfig config;
         LaunchMode launchMode;
diff --git a/extensions/debug/runtime/src/main/java/org/apache/camel/quarkus/component/debug/DebugConfig.java b/extensions/debug/runtime/src/main/java/org/apache/camel/quarkus/component/debug/DebugConfig.java
index f8b1d2716f..3bbcb581a8 100644
--- a/extensions/debug/runtime/src/main/java/org/apache/camel/quarkus/component/debug/DebugConfig.java
+++ b/extensions/debug/runtime/src/main/java/org/apache/camel/quarkus/component/debug/DebugConfig.java
@@ -25,4 +25,10 @@ public class DebugConfig {
      * Set whether to enable Camel debugging support.
      */
     public boolean enabled;
+
+    /**
+     * Indicates whether the <i>suspend mode</i> is enabled or not. If {@code true} the message processing is
+     * immediately suspended until the method {@code attach()} is called.
+     */
+    public boolean suspend;
 }
diff --git a/integration-tests/debug/pom.xml b/integration-tests/debug/pom.xml
index 4dbdfce0e3..4c0a501a4f 100644
--- a/integration-tests/debug/pom.xml
+++ b/integration-tests/debug/pom.xml
@@ -35,6 +35,10 @@
             <groupId>org.apache.camel.quarkus</groupId>
             <artifactId>camel-quarkus-debug</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.apache.camel.quarkus</groupId>
+            <artifactId>camel-quarkus-direct</artifactId>
+        </dependency>
         <dependency>
             <groupId>io.quarkus</groupId>
             <artifactId>quarkus-resteasy</artifactId>
@@ -76,6 +80,19 @@
                         </exclusion>
                     </exclusions>
                 </dependency>
+                <dependency>
+                    <groupId>org.apache.camel.quarkus</groupId>
+                    <artifactId>camel-quarkus-direct-deployment</artifactId>
+                    <version>${project.version}</version>
+                    <type>pom</type>
+                    <scope>test</scope>
+                    <exclusions>
+                        <exclusion>
+                            <groupId>*</groupId>
+                            <artifactId>*</artifactId>
+                        </exclusion>
+                    </exclusions>
+                </dependency>
             </dependencies>
         </profile>
         <profile>
diff --git a/extensions/debug/runtime/src/main/java/org/apache/camel/quarkus/component/debug/DebugConfig.java b/integration-tests/debug/src/main/java/org/apache/camel/quarkus/component/debug/it/DebugRoutes.java
similarity index 67%
copy from extensions/debug/runtime/src/main/java/org/apache/camel/quarkus/component/debug/DebugConfig.java
copy to integration-tests/debug/src/main/java/org/apache/camel/quarkus/component/debug/it/DebugRoutes.java
index f8b1d2716f..b92b177c53 100644
--- a/extensions/debug/runtime/src/main/java/org/apache/camel/quarkus/component/debug/DebugConfig.java
+++ b/integration-tests/debug/src/main/java/org/apache/camel/quarkus/component/debug/it/DebugRoutes.java
@@ -14,15 +14,18 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.quarkus.component.debug;
+package org.apache.camel.quarkus.component.debug.it;
 
-import io.quarkus.runtime.annotations.ConfigPhase;
-import io.quarkus.runtime.annotations.ConfigRoot;
+import org.apache.camel.builder.RouteBuilder;
 
-@ConfigRoot(name = "camel.debug", phase = ConfigPhase.BUILD_AND_RUN_TIME_FIXED)
-public class DebugConfig {
-    /**
-     * Set whether to enable Camel debugging support.
-     */
-    public boolean enabled;
+public class DebugRoutes extends RouteBuilder {
+
+    @Override
+    public void configure() {
+        getContext().setUseBreadcrumb(false);
+        getContext().setDebugging(true);
+        getContext().setMessageHistory(true);
+        from("direct:start")
+                .log("Processing");
+    }
 }
diff --git a/integration-tests/debug/src/test/java/org/apache/camel/quarkus/component/debug/it/DebugTest.java b/integration-tests/debug/src/test/java/org/apache/camel/quarkus/component/debug/it/DebugTest.java
index f613f742b3..e3edfd9d78 100644
--- a/integration-tests/debug/src/test/java/org/apache/camel/quarkus/component/debug/it/DebugTest.java
+++ b/integration-tests/debug/src/test/java/org/apache/camel/quarkus/component/debug/it/DebugTest.java
@@ -19,6 +19,7 @@ package org.apache.camel.quarkus.component.debug.it;
 import java.util.Iterator;
 import java.util.Set;
 
+import javax.management.JMX;
 import javax.management.MBeanServerConnection;
 import javax.management.ObjectInstance;
 import javax.management.ObjectName;
@@ -29,6 +30,7 @@ import javax.management.remote.JMXServiceURL;
 import io.quarkus.test.junit.QuarkusTest;
 import io.restassured.RestAssured;
 import org.apache.camel.ServiceStatus;
+import org.apache.camel.api.management.mbean.ManagedBacklogDebuggerMBean;
 import org.junit.jupiter.api.Test;
 
 import static org.apache.camel.component.debug.JmxConnectorService.DEFAULT_HOST;
@@ -76,4 +78,33 @@ public class DebugTest {
             }
         }
     }
+
+    @Test
+    void accessToBacklogDebugger() throws Exception {
+        String url = String.format("service:jmx:rmi:///jndi/rmi://%s:%d%s", DEFAULT_HOST, DEFAULT_REGISTRY_PORT,
+                DEFAULT_SERVICE_URL_PATH);
+        JMXServiceURL jmxUrl = new JMXServiceURL(url);
+
+        try (JMXConnector connector = JMXConnectorFactory.connect(jmxUrl)) {
+            MBeanServerConnection mbeanServer = connector.getMBeanServerConnection();
+
+            ObjectName objectName = new ObjectName("org.apache.camel:context=*,type=tracer,name=BacklogDebugger");
+            Set<ObjectName> names = mbeanServer.queryNames(objectName, null);
+            assertNotNull(names);
+
+            Iterator<ObjectName> iteratorNames = names.iterator();
+            if (iteratorNames.hasNext()) {
+                ObjectName debuggerMBeanObjectName = iteratorNames.next();
+                assertNotNull(debuggerMBeanObjectName);
+                ManagedBacklogDebuggerMBean backlogDebugger = JMX.newMBeanProxy(mbeanServer, debuggerMBeanObjectName,
+                        ManagedBacklogDebuggerMBean.class);
+                Set<String> breakpoints = backlogDebugger.breakpoints();
+                assertNotNull(breakpoints);
+                Set<String> suspendedBreakpointNodeIds = backlogDebugger.suspendedBreakpointNodeIds();
+                assertNotNull(suspendedBreakpointNodeIds);
+            } else {
+                fail("Expected to find 1 BacklogDebugger");
+            }
+        }
+    }
 }