This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/camel.git
commit 58508d8c6ba4100b3965d11d70e3746b85889fb8 Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Wed Jun 12 06:38:46 2019 +0200 CAMEL-13369: Message History EIP now supports filtering nodes and to keep a copy of the traced message. --- .../apache/camel/spi/MessageHistoryFactory.java | 3 +- .../impl/engine/DefaultMessageHistoryFactory.java | 17 ++++ .../management/ManagedMessageHistoryTest.java | 103 +++++++++++++++++++++ 3 files changed, 122 insertions(+), 1 deletion(-) diff --git a/core/camel-api/src/main/java/org/apache/camel/spi/MessageHistoryFactory.java b/core/camel-api/src/main/java/org/apache/camel/spi/MessageHistoryFactory.java index 12c95f6..7a12b742 100644 --- a/core/camel-api/src/main/java/org/apache/camel/spi/MessageHistoryFactory.java +++ b/core/camel-api/src/main/java/org/apache/camel/spi/MessageHistoryFactory.java @@ -16,6 +16,7 @@ */ package org.apache.camel.spi; +import org.apache.camel.CamelContextAware; import org.apache.camel.Exchange; import org.apache.camel.MessageHistory; import org.apache.camel.NamedNode; @@ -24,7 +25,7 @@ import org.apache.camel.StaticService; /** * A factory to create {@link MessageHistory} instances. */ -public interface MessageHistoryFactory extends StaticService { +public interface MessageHistoryFactory extends StaticService, CamelContextAware { /** * Creates a new {@link MessageHistory} diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultMessageHistoryFactory.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultMessageHistoryFactory.java index 13acc5c..453ab19 100644 --- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultMessageHistoryFactory.java +++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultMessageHistoryFactory.java @@ -16,6 +16,7 @@ */ package org.apache.camel.impl.engine; +import org.apache.camel.CamelContext; import org.apache.camel.Exchange; import org.apache.camel.Message; import org.apache.camel.MessageHistory; @@ -30,11 +31,22 @@ import org.apache.camel.support.service.ServiceSupport; @ManagedResource(description = "Managed MessageHistoryFactory") public class DefaultMessageHistoryFactory extends ServiceSupport implements MessageHistoryFactory { + private CamelContext camelContext; private boolean copyMessage; private String nodePattern; private volatile String[] nodePatternParts; @Override + public CamelContext getCamelContext() { + return camelContext; + } + + @Override + public void setCamelContext(CamelContext camelContext) { + this.camelContext = camelContext; + } + + @Override public MessageHistory newMessageHistory(String routeId, NamedNode node, long timestamp, Exchange exchange) { if (nodePatternParts != null) { String name = node.getShortName(); @@ -54,6 +66,11 @@ public class DefaultMessageHistoryFactory extends ServiceSupport implements Mess return new DefaultMessageHistory(routeId, node, timestamp, msg); } + @ManagedAttribute(description = "Whether message history is enabled") + public boolean isEnabled() { + return camelContext != null ? camelContext.isMessageHistory() : false; + } + @ManagedAttribute(description = "Whether a copy of the message is included in the message history") public boolean isCopyMessage() { return copyMessage; diff --git a/core/camel-management-impl/src/test/java/org/apache/camel/management/ManagedMessageHistoryTest.java b/core/camel-management-impl/src/test/java/org/apache/camel/management/ManagedMessageHistoryTest.java new file mode 100644 index 0000000..503156b --- /dev/null +++ b/core/camel-management-impl/src/test/java/org/apache/camel/management/ManagedMessageHistoryTest.java @@ -0,0 +1,103 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.management; + +import java.util.List; + +import javax.management.MBeanServer; +import javax.management.ObjectName; + +import org.apache.camel.Exchange; +import org.apache.camel.MessageHistory; +import org.apache.camel.builder.RouteBuilder; +import org.junit.Test; + +public class ManagedMessageHistoryTest extends ManagementTestSupport { + + @Test + public void testStepOnly() throws Exception { + getMockEndpoint("mock:a").expectedMessageCount(1); + getMockEndpoint("mock:b").expectedMessageCount(1); + getMockEndpoint("mock:bar").expectedMessageCount(1); + + Exchange out = template.request("direct:start", e -> { + e.getMessage().setBody("Hello World"); + }); + + assertMockEndpointsSatisfied(); + + // only the step eips are in the history + List<MessageHistory> history = out.getProperty(Exchange.MESSAGE_HISTORY, List.class); + assertNotNull(history); + assertEquals(3, history.size()); + assertEquals("step", history.get(0).getNode().getShortName()); + assertEquals("a", history.get(0).getNode().getId()); + assertEquals("step", history.get(1).getNode().getShortName()); + assertEquals("b", history.get(1).getNode().getId()); + assertEquals("step", history.get(2).getNode().getShortName()); + assertEquals("bar", history.get(2).getNode().getId()); + + // check mbeans + MBeanServer mbeanServer = getMBeanServer(); + + ObjectName on = ObjectName.getInstance("org.apache.camel:context=camel-1,type=context,name=\"camel-1\""); + assertTrue("Should be registered", mbeanServer.isRegistered(on)); + String name = (String) mbeanServer.getAttribute(on, "CamelId"); + assertEquals("camel-1", name); + Boolean mh = (Boolean) mbeanServer.getAttribute(on, "MessageHistory"); + assertEquals(Boolean.TRUE, mh); + + on = ObjectName.getInstance("org.apache.camel:context=camel-1,type=services,name=DefaultMessageHistoryFactory"); + + assertTrue("Should be registered", mbeanServer.isRegistered(on)); + Boolean en = (Boolean) mbeanServer.getAttribute(on, "Enabled"); + assertEquals(Boolean.TRUE, en); + Boolean cm = (Boolean) mbeanServer.getAttribute(on, "CopyMessage"); + assertEquals(Boolean.FALSE, cm); + String np = (String) mbeanServer.getAttribute(on, "NodePattern"); + assertEquals("step", np); + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + context.setMessageHistory(true); + context.getMessageHistoryFactory().setNodePattern("step"); + + from("direct:start") + .step("a") + .to("log:foo") + .to("mock:a") + .end() + .step("b") + .to("direct:bar") + .to("mock:b") + .end(); + + from("direct:bar") + .step("bar") + .to("log:bar") + .to("mock:bar") + .end(); + } + }; + } + + +}