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");
+ }
+ }
+ }
}