This is an automated email from the ASF dual-hosted git repository. nfilotto pushed a commit to branch CAMEL-18260/reflect-changes-in-backlog-tracer-event-message in repository https://gitbox.apache.org/repos/asf/camel.git
commit f70b75c1e90c18d1a80c80af3a649374daf9a38e Author: Nicolas Filotto <[email protected]> AuthorDate: Fri Jul 8 16:26:10 2022 +0200 CAMEL-18260: debugger - Reflect exchange changes on BacklogTracerEventMessage --- .../camel/impl/debugger/BacklogDebugger.java | 38 +++++++++++++++++++--- .../camel/management/BacklogDebuggerTest.java | 22 +++++++++++++ 2 files changed, 56 insertions(+), 4 deletions(-) diff --git a/core/camel-base-engine/src/main/java/org/apache/camel/impl/debugger/BacklogDebugger.java b/core/camel-base-engine/src/main/java/org/apache/camel/impl/debugger/BacklogDebugger.java index f95315ed42f..d495793a4ec 100644 --- a/core/camel-base-engine/src/main/java/org/apache/camel/impl/debugger/BacklogDebugger.java +++ b/core/camel-base-engine/src/main/java/org/apache/camel/impl/debugger/BacklogDebugger.java @@ -382,6 +382,7 @@ public final class BacklogDebugger extends ServiceSupport { } else { se.getExchange().getMessage().setBody(body); } + refreshBacklogTracerEventMessage(nodeId, se); } } } @@ -392,6 +393,7 @@ public final class BacklogDebugger extends ServiceSupport { logger.log("Breakpoint at node " + nodeId + " is removing message body on exchangeId: " + se.getExchange().getExchangeId()); se.getExchange().getMessage().setBody(null); + refreshBacklogTracerEventMessage(nodeId, se); } } @@ -418,6 +420,7 @@ public final class BacklogDebugger extends ServiceSupport { } else { se.getExchange().getMessage().setHeader(headerName, value); } + refreshBacklogTracerEventMessage(nodeId, se); } } @@ -435,6 +438,7 @@ public final class BacklogDebugger extends ServiceSupport { logger.log("Breakpoint at node " + nodeId + " is removing message header on exchangeId: " + se.getExchange().getExchangeId() + " with header: " + headerName); se.getExchange().getMessage().removeHeader(headerName); + refreshBacklogTracerEventMessage(nodeId, se); } } @@ -595,6 +599,34 @@ public final class BacklogDebugger extends ServiceSupport { suspendedBreakpointMessages.clear(); } + /** + * Refresh the content of the existing backlog tracer event message corresponding to the given node id with the new + * content of exchange. + * + * @param nodeId the node id for the breakpoint + * @param suspendedExchange the content of the new suspended exchange to use to refresh the backlog tracer event + * message. + */ + private void refreshBacklogTracerEventMessage(String nodeId, SuspendedExchange suspendedExchange) { + suspendedBreakpointMessages.computeIfPresent( + nodeId, + (nId, message) -> new DefaultBacklogTracerEventMessage( + message.getUid(), message.getTimestamp(), message.getRouteId(), message.getToNode(), + message.getExchangeId(), + dumpAsXml(suspendedExchange.getExchange()))); + } + + /** + * Dumps the message as a generic XML structure. + * + * @param exchange the exchange to dump as XML + * @return the XML + */ + private String dumpAsXml(Exchange exchange) { + return MessageHelper.dumpAsXml(exchange.getIn(), true, 2, isBodyIncludeStreams(), isBodyIncludeFiles(), + getBodyMaxChars()); + } + /** * Represents a {@link org.apache.camel.spi.Breakpoint} that has a {@link Condition} on a specific node id. */ @@ -623,8 +655,7 @@ public final class BacklogDebugger extends ServiceSupport { String toNode = definition.getId(); String routeId = CamelContextHelper.getRouteId(definition); String exchangeId = exchange.getExchangeId(); - String messageAsXml = MessageHelper.dumpAsXml(exchange.getIn(), true, 2, isBodyIncludeStreams(), - isBodyIncludeFiles(), getBodyMaxChars()); + String messageAsXml = dumpAsXml(exchange); long uid = debugCounter.incrementAndGet(); BacklogTracerEventMessage msg @@ -686,8 +717,7 @@ public final class BacklogDebugger extends ServiceSupport { String toNode = definition.getId(); String routeId = CamelContextHelper.getRouteId(definition); String exchangeId = exchange.getExchangeId(); - String messageAsXml = MessageHelper.dumpAsXml(exchange.getIn(), true, 2, isBodyIncludeStreams(), - isBodyIncludeFiles(), getBodyMaxChars()); + String messageAsXml = dumpAsXml(exchange); long uid = debugCounter.incrementAndGet(); BacklogTracerEventMessage msg diff --git a/core/camel-management/src/test/java/org/apache/camel/management/BacklogDebuggerTest.java b/core/camel-management/src/test/java/org/apache/camel/management/BacklogDebuggerTest.java index 21386b3526c..1d1cc1c443c 100644 --- a/core/camel-management/src/test/java/org/apache/camel/management/BacklogDebuggerTest.java +++ b/core/camel-management/src/test/java/org/apache/camel/management/BacklogDebuggerTest.java @@ -250,6 +250,28 @@ public class BacklogDebuggerTest extends ManagementTestSupport { "Should contain our added header"); assertTrue(xml.contains("<exchangeProperty name=\"food\" type=\"java.lang.Integer\">987</exchangeProperty>"), "Should contain our added exchange property"); + + // update body and header + mbeanServer.invoke(on, "setMessageBodyOnBreakpoint", new Object[] { "bar", "555", "java.lang.Integer" }, + new String[] { "java.lang.String", "java.lang.Object", "java.lang.String" }); + mbeanServer.invoke(on, "setMessageHeaderOnBreakpoint", new Object[] { "bar", "wine", "456", "java.lang.Integer" }, + new String[] { "java.lang.String", "java.lang.String", "java.lang.Object", "java.lang.String" }); + mbeanServer.invoke(on, "setExchangePropertyOnBreakpoint", new Object[] { "bar", "drink", "798", "java.lang.Integer" }, + new String[] { "java.lang.String", "java.lang.String", "java.lang.Object", "java.lang.String" }); + + // the message should be updated + xml = (String) mbeanServer.invoke(on, "dumpTracedMessagesAsXml", new Object[] { "bar", true }, + new String[] { "java.lang.String", "boolean" }); + assertNotNull(xml); + log.info(xml); + + assertTrue(xml.contains("555"), "Should contain our body"); + assertTrue(xml.contains("<toNode>bar</toNode>"), "Should contain bar node"); + assertTrue(xml.contains("<header key=\"wine\" type=\"java.lang.Integer\">456</header>"), + "Should contain our added header"); + assertTrue(xml.contains("<exchangeProperty name=\"drink\" type=\"java.lang.Integer\">798</exchangeProperty>"), + "Should contain our added exchange property"); + resetMocks(); mock.expectedMessageCount(1);
