CAMEL-8526: Add more EIP as specialized mbeans
Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/6f27b9ac Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/6f27b9ac Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/6f27b9ac Branch: refs/heads/master Commit: 6f27b9ac63618f0cbd38ce4c6ef30f2c8eb687fb Parents: c397832 Author: Claus Ibsen <davscl...@apache.org> Authored: Fri Jul 24 12:48:36 2015 +0200 Committer: Claus Ibsen <davscl...@apache.org> Committed: Fri Jul 24 12:48:36 2015 +0200 ---------------------------------------------------------------------- .../mbean/ManagedStickyLoadBalancerMBean.java | 32 +++++++ .../DefaultManagementObjectStrategy.java | 4 + .../mbean/ManagedRoundRobinLoadBalancer.java | 4 +- .../mbean/ManagedStickyLoadBalancer.java | 59 +++++++++++++ .../camel/model/LoadBalanceDefinition.java | 2 +- .../StickyLoadBalancerDefinition.java | 9 ++ .../loadbalancer/StickyLoadBalancer.java | 1 + .../ManagedStickyLoadBalancerTest.java | 87 ++++++++++++++++++++ 8 files changed, 195 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/6f27b9ac/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedStickyLoadBalancerMBean.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedStickyLoadBalancerMBean.java b/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedStickyLoadBalancerMBean.java new file mode 100644 index 0000000..b2bff85 --- /dev/null +++ b/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedStickyLoadBalancerMBean.java @@ -0,0 +1,32 @@ +/** + * 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.api.management.mbean; + +import org.apache.camel.api.management.ManagedAttribute; + +public interface ManagedStickyLoadBalancerMBean extends ManagedProcessorMBean { + + @ManagedAttribute(description = "The language for the expression") + String getExpressionLanguage(); + + @ManagedAttribute(description = "The correlation expression to use to calculate the correlation key") + String getExpression(); + + @ManagedAttribute(description = "Number of processors in the load balancer") + Integer getSize(); + +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/camel/blob/6f27b9ac/camel-core/src/main/java/org/apache/camel/management/DefaultManagementObjectStrategy.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/management/DefaultManagementObjectStrategy.java b/camel-core/src/main/java/org/apache/camel/management/DefaultManagementObjectStrategy.java index c027967..e4562af 100644 --- a/camel-core/src/main/java/org/apache/camel/management/DefaultManagementObjectStrategy.java +++ b/camel-core/src/main/java/org/apache/camel/management/DefaultManagementObjectStrategy.java @@ -78,6 +78,7 @@ import org.apache.camel.management.mbean.ManagedSetExchangePattern; import org.apache.camel.management.mbean.ManagedSetHeader; import org.apache.camel.management.mbean.ManagedSetProperty; import org.apache.camel.management.mbean.ManagedSplitter; +import org.apache.camel.management.mbean.ManagedStickyLoadBalancer; import org.apache.camel.management.mbean.ManagedStop; import org.apache.camel.management.mbean.ManagedSuspendableRoute; import org.apache.camel.management.mbean.ManagedThreadPool; @@ -137,6 +138,7 @@ import org.apache.camel.processor.aggregate.AggregateProcessor; import org.apache.camel.processor.idempotent.IdempotentConsumer; import org.apache.camel.processor.loadbalancer.RandomLoadBalancer; import org.apache.camel.processor.loadbalancer.RoundRobinLoadBalancer; +import org.apache.camel.processor.loadbalancer.StickyLoadBalancer; import org.apache.camel.processor.validation.PredicateValidatingProcessor; import org.apache.camel.spi.BrowsableEndpoint; import org.apache.camel.spi.EventNotifier; @@ -293,6 +295,8 @@ public class DefaultManagementObjectStrategy implements ManagementObjectStrategy answer = new ManagedRandomLoadBalancer(context, (RandomLoadBalancer) target, (org.apache.camel.model.LoadBalanceDefinition) definition); } else if (target instanceof RoundRobinLoadBalancer) { answer = new ManagedRoundRobinLoadBalancer(context, (RoundRobinLoadBalancer) target, (org.apache.camel.model.LoadBalanceDefinition) definition); + } else if (target instanceof StickyLoadBalancer) { + answer = new ManagedStickyLoadBalancer(context, (StickyLoadBalancer) target, (org.apache.camel.model.LoadBalanceDefinition) definition); } else if (target instanceof RecipientList) { answer = new ManagedRecipientList(context, (RecipientList) target, (RecipientListDefinition) definition); } else if (target instanceof Splitter) { http://git-wip-us.apache.org/repos/asf/camel/blob/6f27b9ac/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedRoundRobinLoadBalancer.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedRoundRobinLoadBalancer.java b/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedRoundRobinLoadBalancer.java index 1178fdb..c8de3fe 100644 --- a/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedRoundRobinLoadBalancer.java +++ b/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedRoundRobinLoadBalancer.java @@ -18,7 +18,7 @@ package org.apache.camel.management.mbean; import org.apache.camel.CamelContext; import org.apache.camel.api.management.ManagedResource; -import org.apache.camel.api.management.mbean.ManagedRandomLoadBalancerMBean; +import org.apache.camel.api.management.mbean.ManagedRoundRobinLoadBalancerMBean; import org.apache.camel.model.LoadBalanceDefinition; import org.apache.camel.processor.loadbalancer.RoundRobinLoadBalancer; @@ -26,7 +26,7 @@ import org.apache.camel.processor.loadbalancer.RoundRobinLoadBalancer; * @version */ @ManagedResource(description = "Managed RoundRobin LoadBalancer") -public class ManagedRoundRobinLoadBalancer extends ManagedProcessor implements ManagedRandomLoadBalancerMBean { +public class ManagedRoundRobinLoadBalancer extends ManagedProcessor implements ManagedRoundRobinLoadBalancerMBean { private final RoundRobinLoadBalancer processor; public ManagedRoundRobinLoadBalancer(CamelContext context, RoundRobinLoadBalancer processor, LoadBalanceDefinition definition) { http://git-wip-us.apache.org/repos/asf/camel/blob/6f27b9ac/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedStickyLoadBalancer.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedStickyLoadBalancer.java b/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedStickyLoadBalancer.java new file mode 100644 index 0000000..0835aa7 --- /dev/null +++ b/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedStickyLoadBalancer.java @@ -0,0 +1,59 @@ +/** + * 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.mbean; + +import org.apache.camel.CamelContext; +import org.apache.camel.api.management.ManagedResource; +import org.apache.camel.api.management.mbean.ManagedStickyLoadBalancerMBean; +import org.apache.camel.model.LoadBalanceDefinition; +import org.apache.camel.model.loadbalancer.StickyLoadBalancerDefinition; +import org.apache.camel.processor.loadbalancer.StickyLoadBalancer; + +/** + * @version + */ +@ManagedResource(description = "Managed Sticky LoadBalancer") +public class ManagedStickyLoadBalancer extends ManagedProcessor implements ManagedStickyLoadBalancerMBean { + private final StickyLoadBalancer processor; + + public ManagedStickyLoadBalancer(CamelContext context, StickyLoadBalancer processor, LoadBalanceDefinition definition) { + super(context, processor, definition); + this.processor = processor; + } + + @Override + public LoadBalanceDefinition getDefinition() { + return (LoadBalanceDefinition) super.getDefinition(); + } + + @Override + public String getExpressionLanguage() { + StickyLoadBalancerDefinition sticky = (StickyLoadBalancerDefinition) getDefinition().getLoadBalancerType(); + return sticky.getCorrelationExpression().getExpressionType().getLanguage(); + } + + @Override + public String getExpression() { + StickyLoadBalancerDefinition sticky = (StickyLoadBalancerDefinition) getDefinition().getLoadBalancerType(); + return sticky.getCorrelationExpression().getExpressionType().getExpression(); + } + + @Override + public Integer getSize() { + return processor.getProcessors().size(); + } +} http://git-wip-us.apache.org/repos/asf/camel/blob/6f27b9ac/camel-core/src/main/java/org/apache/camel/model/LoadBalanceDefinition.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/model/LoadBalanceDefinition.java b/camel-core/src/main/java/org/apache/camel/model/LoadBalanceDefinition.java index e41e2c5..ecb7145 100644 --- a/camel-core/src/main/java/org/apache/camel/model/LoadBalanceDefinition.java +++ b/camel-core/src/main/java/org/apache/camel/model/LoadBalanceDefinition.java @@ -286,7 +286,7 @@ public class LoadBalanceDefinition extends ProcessorDefinition<LoadBalanceDefini */ public LoadBalanceDefinition sticky(Expression correlationExpression) { StickyLoadBalancerDefinition def = new StickyLoadBalancerDefinition(); - def.setCorrelationExpression(new ExpressionSubElementDefinition(correlationExpression)); + def.setCorrelationExpression(correlationExpression); setLoadBalancerType(def); return this; } http://git-wip-us.apache.org/repos/asf/camel/blob/6f27b9ac/camel-core/src/main/java/org/apache/camel/model/loadbalancer/StickyLoadBalancerDefinition.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/model/loadbalancer/StickyLoadBalancerDefinition.java b/camel-core/src/main/java/org/apache/camel/model/loadbalancer/StickyLoadBalancerDefinition.java index ae2dd8c..72ae1a2 100644 --- a/camel-core/src/main/java/org/apache/camel/model/loadbalancer/StickyLoadBalancerDefinition.java +++ b/camel-core/src/main/java/org/apache/camel/model/loadbalancer/StickyLoadBalancerDefinition.java @@ -21,8 +21,11 @@ import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; +import org.apache.camel.Expression; +import org.apache.camel.model.ExpressionNodeHelper; import org.apache.camel.model.ExpressionSubElementDefinition; import org.apache.camel.model.LoadBalancerDefinition; +import org.apache.camel.model.language.ExpressionDefinition; import org.apache.camel.processor.loadbalancer.LoadBalancer; import org.apache.camel.processor.loadbalancer.StickyLoadBalancer; import org.apache.camel.spi.Metadata; @@ -60,6 +63,12 @@ public class StickyLoadBalancerDefinition extends LoadBalancerDefinition { this.correlationExpression = correlationExpression; } + public void setCorrelationExpression(Expression expression) { + ExpressionDefinition def = ExpressionNodeHelper.toExpressionDefinition(expression); + this.correlationExpression = new ExpressionSubElementDefinition(); + this.correlationExpression.setExpressionType(def); + } + @Override public String toString() { return "StickyLoadBalancer[" + correlationExpression + "]"; http://git-wip-us.apache.org/repos/asf/camel/blob/6f27b9ac/camel-core/src/main/java/org/apache/camel/processor/loadbalancer/StickyLoadBalancer.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/processor/loadbalancer/StickyLoadBalancer.java b/camel-core/src/main/java/org/apache/camel/processor/loadbalancer/StickyLoadBalancer.java index 519a93a..cea84d5 100644 --- a/camel-core/src/main/java/org/apache/camel/processor/loadbalancer/StickyLoadBalancer.java +++ b/camel-core/src/main/java/org/apache/camel/processor/loadbalancer/StickyLoadBalancer.java @@ -83,6 +83,7 @@ public class StickyLoadBalancer extends QueueLoadBalancer { // Properties //------------------------------------------------------------------------- + public int getNumberOfHashGroups() { return numberOfHashGroups; } http://git-wip-us.apache.org/repos/asf/camel/blob/6f27b9ac/camel-core/src/test/java/org/apache/camel/management/ManagedStickyLoadBalancerTest.java ---------------------------------------------------------------------- diff --git a/camel-core/src/test/java/org/apache/camel/management/ManagedStickyLoadBalancerTest.java b/camel-core/src/test/java/org/apache/camel/management/ManagedStickyLoadBalancerTest.java new file mode 100644 index 0000000..4f6a9ff --- /dev/null +++ b/camel-core/src/test/java/org/apache/camel/management/ManagedStickyLoadBalancerTest.java @@ -0,0 +1,87 @@ +/** + * 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 javax.management.MBeanServer; +import javax.management.ObjectName; +import javax.management.openmbean.TabularData; + +import org.apache.camel.ServiceStatus; +import org.apache.camel.builder.RouteBuilder; + +/** + * @version + */ +public class ManagedStickyLoadBalancerTest extends ManagementTestSupport { + + public void testManageRandomLoadBalancer() throws Exception { + // JMX tests dont work well on AIX CI servers (hangs them) + if (isPlatform("aix")) { + return; + } + + // get the stats for the route + MBeanServer mbeanServer = getMBeanServer(); + + // get the object name for the delayer + ObjectName on = ObjectName.getInstance("org.apache.camel:context=camel-1,type=processors,name=\"mysend\""); + + // should be on route1 + String routeId = (String) mbeanServer.getAttribute(on, "RouteId"); + assertEquals("route1", routeId); + + String camelId = (String) mbeanServer.getAttribute(on, "CamelId"); + assertEquals("camel-1", camelId); + + String state = (String) mbeanServer.getAttribute(on, "State"); + assertEquals(ServiceStatus.Started.name(), state); + + Integer size = (Integer) mbeanServer.getAttribute(on, "Size"); + assertEquals(2, size.intValue()); + + String lan = (String) mbeanServer.getAttribute(on, "ExpressionLanguage"); + assertEquals("header", lan); + + String uri = (String) mbeanServer.getAttribute(on, "Expression"); + assertEquals("num", uri); + + TabularData data = (TabularData) mbeanServer.invoke(on, "explain", new Object[]{false}, new String[]{"boolean"}); + assertNotNull(data); + assertEquals(2, data.size()); + + data = (TabularData) mbeanServer.invoke(on, "explain", new Object[]{true}, new String[]{"boolean"}); + assertNotNull(data); + assertEquals(5, data.size()); + + String json = (String) mbeanServer.invoke(on, "informationJson", null, null); + assertNotNull(json); + assertTrue(json.contains("\"description\": \"Balances message processing among a number of nodes")); + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + from("direct:start") + .loadBalance().sticky(header("num")).id("mysend") + .to("mock:foo", "mock:bar"); + } + }; + } + +}