This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/main by this push: new d606aef CAMEL-17371 - set and remove Exchange Properties (#6586) d606aef is described below commit d606aefce49ebb040da4cbfe66ae2aae411be8e4 Author: javaduke <eugene.ber...@modusbox.com> AuthorDate: Thu Dec 23 06:40:16 2021 -0700 CAMEL-17371 - set and remove Exchange Properties (#6586) --- .../mbean/ManagedBacklogDebuggerMBean.java | 9 ++++++ .../management/mbean/ManagedBacklogDebugger.java | 35 ++++++++++++++++++++++ .../camel/management/BacklogDebuggerTest.java | 28 +++++++++++------ .../modules/ROOT/pages/backlog-debugger.adoc | 1 + 4 files changed, 64 insertions(+), 9 deletions(-) diff --git a/core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/ManagedBacklogDebuggerMBean.java b/core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/ManagedBacklogDebuggerMBean.java index e75daf2..7695974 100644 --- a/core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/ManagedBacklogDebuggerMBean.java +++ b/core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/ManagedBacklogDebuggerMBean.java @@ -163,4 +163,13 @@ public interface ManagedBacklogDebuggerMBean { @ManagedOperation(description = "Evaluates the expression at a given breakpoint node id and returns the result as String") String evaluateExpressionAtBreakpoint(String nodeId, String language, String expression); + + @ManagedOperation(description = "Updates/adds the exchange property (uses same type as old exchange property value) on the suspended breakpoint at the given node id") + void setExchangePropertyOnBreakpoint(String nodeId, String exchangePropertyName, Object value); + + @ManagedOperation(description = "Removes the exchange property on the suspended breakpoint at the given node id") + void removeExchangePropertyOnBreakpoint(String nodeId, String exchangePropertyName); + + @ManagedOperation(description = "Updates/adds the exchange property (with a new type) on the suspended breakpoint at the given node id") + void setExchangePropertyOnBreakpoint(String nodeId, String exchangePropertyName, Object value, String type); } diff --git a/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedBacklogDebugger.java b/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedBacklogDebugger.java index 0fa8f21..6188f0f 100644 --- a/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedBacklogDebugger.java +++ b/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedBacklogDebugger.java @@ -301,6 +301,41 @@ public class ManagedBacklogDebugger implements ManagedBacklogDebuggerMBean { } @Override + public void setExchangePropertyOnBreakpoint(String nodeId, String exchangePropertyName, Object value) { + Exchange suspendedExchange = backlogDebugger.getSuspendedExchange(nodeId); + if (suspendedExchange != null) { + suspendedExchange.setProperty(exchangePropertyName, value); + } + } + + @Override + public void removeExchangePropertyOnBreakpoint(String nodeId, String exchangePropertyName) { + Exchange suspendedExchange = backlogDebugger.getSuspendedExchange(nodeId); + if (suspendedExchange != null) { + suspendedExchange.removeProperty(exchangePropertyName); + } + } + + @Override + public void setExchangePropertyOnBreakpoint(String nodeId, String exchangePropertyName, Object value, String type) { + try { + Class<?> classType = camelContext.getClassResolver().resolveMandatoryClass(type); + if (type != null) { + Exchange suspendedExchange = backlogDebugger.getSuspendedExchange(nodeId); + if (suspendedExchange != null) { + value = suspendedExchange.getContext().getTypeConverter().mandatoryConvertTo(classType, suspendedExchange, + value); + suspendedExchange.setProperty(exchangePropertyName, value); + } + } else { + this.setExchangePropertyOnBreakpoint(nodeId, exchangePropertyName, value); + } + } catch (Exception e) { + throw RuntimeCamelException.wrapRuntimeCamelException(e); + } + } + + @Override public Object evaluateExpressionAtBreakpoint(String nodeId, String language, String expression, String resultType) { Exchange suspendedExchange; try { 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 401c36d..c368f52 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 @@ -100,7 +100,7 @@ public class BacklogDebuggerTest extends ManagementTestSupport { @SuppressWarnings("unchecked") @Test - public void testBacklogDebuggerUpdateBodyAndHeader() throws Exception { + public void testBacklogDebuggerUpdateBodyExchangePropertyAndHeader() throws Exception { MBeanServer mbeanServer = getMBeanServer(); ObjectName on = new ObjectName( "org.apache.camel:context=" + context.getManagementName() + ",type=tracer,name=BacklogDebugger"); @@ -139,6 +139,8 @@ public class BacklogDebuggerTest extends ManagementTestSupport { new String[] { "java.lang.String", "java.lang.Object" }); mbeanServer.invoke(on, "setMessageHeaderOnBreakpoint", new Object[] { "foo", "beer", "Carlsberg" }, new String[] { "java.lang.String", "java.lang.String", "java.lang.Object" }); + mbeanServer.invoke(on, "setExchangePropertyOnBreakpoint", new Object[] { "foo", "food", "Bratwurst" }, + new String[] { "java.lang.String", "java.lang.String", "java.lang.Object" }); // resume breakpoint mbeanServer.invoke(on, "resumeBreakpoint", new Object[] { "foo" }, new String[] { "java.lang.String" }); @@ -152,8 +154,8 @@ public class BacklogDebuggerTest extends ManagementTestSupport { }); // the message should be ours - String xml = (String) mbeanServer.invoke(on, "dumpTracedMessagesAsXml", new Object[] { "bar" }, - new String[] { "java.lang.String" }); + String xml = (String) mbeanServer.invoke(on, "dumpTracedMessagesAsXml", new Object[] { "bar", true }, + new String[] { "java.lang.String", "boolean" }); assertNotNull(xml); log.info(xml); @@ -161,6 +163,8 @@ public class BacklogDebuggerTest extends ManagementTestSupport { assertTrue(xml.contains("<toNode>bar</toNode>"), "Should contain bar node"); assertTrue(xml.contains("<header key=\"beer\" type=\"java.lang.String\">Carlsberg</header>"), "Should contain our added header"); + assertTrue(xml.contains("<exchangeProperty name=\"food\" type=\"java.lang.String\">Bratwurst</exchangeProperty>"), + "Should contain our added exchange property"); resetMocks(); mock.expectedMessageCount(1); @@ -178,7 +182,7 @@ public class BacklogDebuggerTest extends ManagementTestSupport { @SuppressWarnings("unchecked") @Test - public void testBacklogDebuggerUpdateBodyAndHeaderType() throws Exception { + public void testBacklogDebuggerUpdateBodyExchangePropertyAndHeaderType() throws Exception { MBeanServer mbeanServer = getMBeanServer(); ObjectName on = new ObjectName( "org.apache.camel:context=" + context.getManagementName() + ",type=tracer,name=BacklogDebugger"); @@ -217,6 +221,8 @@ public class BacklogDebuggerTest extends ManagementTestSupport { new String[] { "java.lang.String", "java.lang.Object", "java.lang.String" }); mbeanServer.invoke(on, "setMessageHeaderOnBreakpoint", new Object[] { "foo", "beer", "123", "java.lang.Integer" }, new String[] { "java.lang.String", "java.lang.String", "java.lang.Object", "java.lang.String" }); + mbeanServer.invoke(on, "setExchangePropertyOnBreakpoint", new Object[] { "foo", "food", "987", "java.lang.Integer" }, + new String[] { "java.lang.String", "java.lang.String", "java.lang.Object", "java.lang.String" }); // resume breakpoint mbeanServer.invoke(on, "resumeBreakpoint", new Object[] { "foo" }, new String[] { "java.lang.String" }); @@ -230,8 +236,8 @@ public class BacklogDebuggerTest extends ManagementTestSupport { }); // the message should be ours - String xml = (String) mbeanServer.invoke(on, "dumpTracedMessagesAsXml", new Object[] { "bar" }, - new String[] { "java.lang.String" }); + String xml = (String) mbeanServer.invoke(on, "dumpTracedMessagesAsXml", new Object[] { "bar", true }, + new String[] { "java.lang.String", "boolean" }); assertNotNull(xml); log.info(xml); @@ -239,7 +245,8 @@ public class BacklogDebuggerTest extends ManagementTestSupport { assertTrue(xml.contains("<toNode>bar</toNode>"), "Should contain bar node"); assertTrue(xml.contains("<header key=\"beer\" type=\"java.lang.Integer\">123</header>"), "Should contain our added header"); - + assertTrue(xml.contains("<exchangeProperty name=\"food\" type=\"java.lang.Integer\">987</exchangeProperty>"), + "Should contain our added exchange property"); resetMocks(); mock.expectedMessageCount(1); @@ -294,6 +301,8 @@ public class BacklogDebuggerTest extends ManagementTestSupport { mbeanServer.invoke(on, "removeMessageBodyOnBreakpoint", new Object[] { "foo" }, new String[] { "java.lang.String" }); mbeanServer.invoke(on, "removeMessageHeaderOnBreakpoint", new Object[] { "foo", "beer" }, new String[] { "java.lang.String", "java.lang.String" }); + mbeanServer.invoke(on, "removeExchangePropertyOnBreakpoint", new Object[] { "foo", "food" }, + new String[] { "java.lang.String", "java.lang.String" }); // resume breakpoint mbeanServer.invoke(on, "resumeBreakpoint", new Object[] { "foo" }, new String[] { "java.lang.String" }); @@ -307,14 +316,15 @@ public class BacklogDebuggerTest extends ManagementTestSupport { }); // the message should be ours - String xml = (String) mbeanServer.invoke(on, "dumpTracedMessagesAsXml", new Object[] { "bar" }, - new String[] { "java.lang.String" }); + String xml = (String) mbeanServer.invoke(on, "dumpTracedMessagesAsXml", new Object[] { "bar", true }, + new String[] { "java.lang.String", "boolean" }); assertNotNull(xml); log.info(xml); assertTrue(xml.contains("<body>[Body is null]</body>"), "Should not contain our body"); assertTrue(xml.contains("<toNode>bar</toNode>"), "Should contain bar node"); assertFalse(xml.contains("<header"), "Should not contain any headers"); + assertFalse(xml.contains("<exchangeProperty name=\"food\""), "Should not contain exchange property 'food'"); resetMocks(); mock.expectedMessageCount(1); diff --git a/docs/user-manual/modules/ROOT/pages/backlog-debugger.adoc b/docs/user-manual/modules/ROOT/pages/backlog-debugger.adoc index f26a9f5..47fcb00 100644 --- a/docs/user-manual/modules/ROOT/pages/backlog-debugger.adoc +++ b/docs/user-manual/modules/ROOT/pages/backlog-debugger.adoc @@ -48,6 +48,7 @@ NOTE: This requires to enabled JMX by including `camel-management` JAR in the cl |`resetDebuggerCounter` |`void` |To reset the debugger counter. |`resumeAll` |`void` |To resume all suspended breakpoints. |`resumeBreakpoint(nodeId)` |`void` |To resume a suspend breakpoint, which will then continue routing the Exchange. +|`setExchangePropertyOnBreakpoint(nodeId,exchangePropertyName,value)` |`void` |To update/add the Exchange property on the suspended Exchange at the node. |`setFallbackTimeout(value)` |`long` |Fallback Timeout in seconds (300 seconds as default) when block the message processing in Camel. A timeout used for waiting for a message to arrive at a given breakpoint. ` |`setMessageBodyOnBreakpoint(nodeId,body)` |`void` |To update the message body on the suspended Exchange at the node. |`setMessageHeaderOnBreakpoint(nodeId,headerName,value)` |`void` |To update/add the message header on the suspended Exchange at the node.