Repository: camel Updated Branches: refs/heads/master 85209dca8 -> b43bdffe7
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/b43bdffe Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/b43bdffe Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/b43bdffe Branch: refs/heads/master Commit: b43bdffe7423a1a989098ada318b867804a28ec7 Parents: 85209dc Author: Claus Ibsen <davscl...@apache.org> Authored: Fri Jul 24 14:01:09 2015 +0200 Committer: Claus Ibsen <davscl...@apache.org> Committed: Fri Jul 24 14:01:09 2015 +0200 ---------------------------------------------------------------------- .../mbean/ManagedCustomLoadBalancerMBean.java | 5 +- .../DefaultManagementObjectStrategy.java | 12 ++ .../mbean/ManagedCustomLoadBalancer.java | 14 ++- .../ManagedCustomLoadBalancerTest.java | 118 +++++++++++++++++++ 4 files changed, 147 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/b43bdffe/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedCustomLoadBalancerMBean.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedCustomLoadBalancerMBean.java b/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedCustomLoadBalancerMBean.java index 47ae3c1..138d507 100644 --- a/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedCustomLoadBalancerMBean.java +++ b/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedCustomLoadBalancerMBean.java @@ -20,8 +20,11 @@ import org.apache.camel.api.management.ManagedAttribute; public interface ManagedCustomLoadBalancerMBean extends ManagedProcessorMBean { + @ManagedAttribute(description = "Reference to the custom load balancer to lookup from the registry to be used") + String getRef(); + @ManagedAttribute(description = "The custom load balancer class name") - String getCustomLoadBalancerClassName(); + String getLoadBalancerClassName(); @ManagedAttribute(description = "Number of processors in the load balancer") Integer getSize(); http://git-wip-us.apache.org/repos/asf/camel/blob/b43bdffe/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 faaaa87..95d2a0f 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 @@ -41,6 +41,7 @@ import org.apache.camel.management.mbean.ManagedCircuitBreakerLoadBalancer; import org.apache.camel.management.mbean.ManagedComponent; import org.apache.camel.management.mbean.ManagedConsumer; import org.apache.camel.management.mbean.ManagedConvertBody; +import org.apache.camel.management.mbean.ManagedCustomLoadBalancer; import org.apache.camel.management.mbean.ManagedDelayer; import org.apache.camel.management.mbean.ManagedDynamicRouter; import org.apache.camel.management.mbean.ManagedEndpoint; @@ -94,11 +95,13 @@ import org.apache.camel.management.mbean.ManagedUnmarshal; import org.apache.camel.management.mbean.ManagedValidate; import org.apache.camel.management.mbean.ManagedWeightedLoadBalancer; import org.apache.camel.management.mbean.ManagedWireTapProcessor; +import org.apache.camel.model.LoadBalanceDefinition; import org.apache.camel.model.ModelCamelContext; import org.apache.camel.model.ProcessDefinition; import org.apache.camel.model.ProcessorDefinition; import org.apache.camel.model.RecipientListDefinition; import org.apache.camel.model.ThreadsDefinition; +import org.apache.camel.model.loadbalancer.CustomLoadBalancerDefinition; import org.apache.camel.processor.ChoiceProcessor; import org.apache.camel.processor.ConvertBodyProcessor; import org.apache.camel.processor.Delayer; @@ -142,6 +145,7 @@ import org.apache.camel.processor.aggregate.AggregateProcessor; import org.apache.camel.processor.idempotent.IdempotentConsumer; import org.apache.camel.processor.loadbalancer.CircuitBreakerLoadBalancer; import org.apache.camel.processor.loadbalancer.FailOverLoadBalancer; +import org.apache.camel.processor.loadbalancer.LoadBalancer; import org.apache.camel.processor.loadbalancer.RandomLoadBalancer; import org.apache.camel.processor.loadbalancer.RoundRobinLoadBalancer; import org.apache.camel.processor.loadbalancer.StickyLoadBalancer; @@ -387,6 +391,14 @@ public class DefaultManagementObjectStrategy implements ManagementObjectStrategy return ((org.apache.camel.spi.ManagementAware<Processor>) target).getManagedObject(processor); } + // special for custom load balancer + if (definition instanceof LoadBalanceDefinition) { + LoadBalanceDefinition lb = (LoadBalanceDefinition) definition; + if (lb.getLoadBalancerType() instanceof CustomLoadBalancerDefinition) { + answer = new ManagedCustomLoadBalancer(context, (LoadBalancer) target, (LoadBalanceDefinition) definition); + } + } + if (answer != null) { // break out as we found an answer break; http://git-wip-us.apache.org/repos/asf/camel/blob/b43bdffe/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedCustomLoadBalancer.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedCustomLoadBalancer.java b/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedCustomLoadBalancer.java index d101c72..3fa414d 100644 --- a/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedCustomLoadBalancer.java +++ b/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedCustomLoadBalancer.java @@ -20,6 +20,7 @@ import org.apache.camel.CamelContext; import org.apache.camel.api.management.ManagedResource; import org.apache.camel.api.management.mbean.ManagedCustomLoadBalancerMBean; import org.apache.camel.model.LoadBalanceDefinition; +import org.apache.camel.model.loadbalancer.CustomLoadBalancerDefinition; import org.apache.camel.processor.loadbalancer.LoadBalancer; import org.apache.camel.util.ObjectHelper; @@ -36,7 +37,18 @@ public class ManagedCustomLoadBalancer extends ManagedProcessor implements Manag } @Override - public String getCustomLoadBalancerClassName() { + public LoadBalanceDefinition getDefinition() { + return (LoadBalanceDefinition) super.getDefinition(); + } + + @Override + public String getRef() { + CustomLoadBalancerDefinition def = (CustomLoadBalancerDefinition) getDefinition().getLoadBalancerType(); + return def.getRef(); + } + + @Override + public String getLoadBalancerClassName() { return ObjectHelper.className(processor); } http://git-wip-us.apache.org/repos/asf/camel/blob/b43bdffe/camel-core/src/test/java/org/apache/camel/management/ManagedCustomLoadBalancerTest.java ---------------------------------------------------------------------- diff --git a/camel-core/src/test/java/org/apache/camel/management/ManagedCustomLoadBalancerTest.java b/camel-core/src/test/java/org/apache/camel/management/ManagedCustomLoadBalancerTest.java new file mode 100644 index 0000000..415b5aa --- /dev/null +++ b/camel-core/src/test/java/org/apache/camel/management/ManagedCustomLoadBalancerTest.java @@ -0,0 +1,118 @@ +/** + * 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.AsyncCallback; +import org.apache.camel.Exchange; +import org.apache.camel.ServiceStatus; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.impl.JndiRegistry; +import org.apache.camel.processor.loadbalancer.LoadBalancerSupport; + +/** + * @version + */ +public class ManagedCustomLoadBalancerTest extends ManagementTestSupport { + + @Override + protected JndiRegistry createRegistry() throws Exception { + JndiRegistry jndi = super.createRegistry(); + jndi.bind("myBalancer", new MyLoadBalancer()); + return jndi; + } + + public void testManageCustomLoadBalancer() 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 ref = (String) mbeanServer.getAttribute(on, "Ref"); + assertEquals("myBalancer", ref); + + String name = (String) mbeanServer.getAttribute(on, "LoadBalancerClassName"); + assertEquals(MyLoadBalancer.class.getName(), name); + + 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().custom("myBalancer").id("mysend") + .to("mock:foo", "mock:bar"); + } + }; + } + + public static class MyLoadBalancer extends LoadBalancerSupport { + + public boolean process(Exchange exchange, AsyncCallback callback) { + String body = exchange.getIn().getBody(String.class); + try { + if ("x".equals(body)) { + getProcessors().get(0).process(exchange); + } else if ("y".equals(body)) { + getProcessors().get(1).process(exchange); + } else { + getProcessors().get(2).process(exchange); + } + } catch (Throwable e) { + exchange.setException(e); + } + callback.done(true); + return true; + } + } + +}