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;
+        }
+    }
+
+}

Reply via email to