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 7c72da24d2 Improve native support of camel-quarkus-debug 7c72da24d2 is described below commit 7c72da24d2c35c59163322ce9557b189be8b500e Author: Nicolas Filotto <nfilo...@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 +++++ .../deployment/CamelSerializationProcessor.java | 4 +++ .../component/debug/deployment/DebugProcessor.java | 11 ++++++++ .../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 ++++++++++++++++++++++ 7 files changed, 87 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-core/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelSerializationProcessor.java b/extensions-core/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelSerializationProcessor.java index d16f6d8574..117d116046 100644 --- a/extensions-core/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelSerializationProcessor.java +++ b/extensions-core/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelSerializationProcessor.java @@ -21,7 +21,9 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.HashMap; +import java.util.HashSet; import java.util.LinkedHashMap; +import java.util.LinkedHashSet; import java.util.List; import io.quarkus.deployment.annotations.BuildProducer; @@ -59,6 +61,8 @@ public class CamelSerializationProcessor { StackTraceElement[].class.getName(), String.class.getName(), Throwable.class.getName(), + HashSet.class.getName(), + LinkedHashSet.class.getName(), // Camel classes CamelExecutionException.class.getName(), 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..dd2457c815 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 @@ -18,10 +18,14 @@ package org.apache.camel.quarkus.component.debug.deployment; 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.runtime.LaunchMode; +import org.apache.camel.api.management.JmxSystemPropertyKeys; +import org.apache.camel.impl.debugger.BacklogDebugger; import org.apache.camel.quarkus.component.debug.DebugConfig; import org.apache.camel.quarkus.core.deployment.spi.CamelServiceDestination; import org.apache.camel.quarkus.core.deployment.spi.CamelServicePatternBuildItem; @@ -48,6 +52,13 @@ 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(BacklogDebugger.SUSPEND_MODE_SYSTEM_PROP_NAME, Boolean.toString(config.suspend))); + producer.produce(new SystemPropertyBuildItem(JmxSystemPropertyKeys.DISABLED, "false")); + } + 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"); + } + } + } }