You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ak...@apache.org on 2010/10/25 21:30:44 UTC

svn commit: r1027242 - in /camel/trunk: camel-core/src/main/java/org/apache/camel/model/ camel-core/src/main/java/org/apache/camel/model/loadbalancer/ camel-core/src/main/java/org/apache/camel/processor/loadbalancer/ camel-core/src/test/java/org/apache...

Author: akarpe
Date: Mon Oct 25 19:30:43 2010
New Revision: 1027242

URL: http://svn.apache.org/viewvc?rev=1027242&view=rev
Log:
CAMEL-3197 - Modified Distribution Ratio from a list to delimited String and modiied behavior throwing soft warning regarding best effort distribution to throw a CamelException.

Modified:
    camel/trunk/camel-core/src/main/java/org/apache/camel/model/LoadBalanceDefinition.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/model/loadbalancer/WeightedLoadBalancerDefinition.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/processor/loadbalancer/WeightedLoadBalancer.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/processor/loadbalancer/WeightedRandomLoadBalancer.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/processor/loadbalancer/WeightedRoundRobinLoadBalancer.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/processor/WeightedRandomLoadBalanceTest.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/processor/WeightedRoundRobinLoadBalanceTest.java
    camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/weightedRandomLoadBalance.xml
    camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/weightedRoundRobinLoadBalance.xml

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/model/LoadBalanceDefinition.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/model/LoadBalanceDefinition.java?rev=1027242&r1=1027241&r2=1027242&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/model/LoadBalanceDefinition.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/model/LoadBalanceDefinition.java Mon Oct 25 19:30:43 2010
@@ -190,12 +190,45 @@ public class LoadBalanceDefinition exten
     /**
      * Uses weighted load balancer
      *
-     * @param roundRobin               used to set the processor selection algorithm.
-     * @param distributionRatioList    ArrayList<Long> of weighted ratios for distribution of messages.
+     * @param roundRobin                   used to set the processor selection algorithm.
+     * @param distributionRatio            String of weighted ratios for distribution of messages.
      * @return the builder
      */
-    public LoadBalanceDefinition weighted(boolean roundRobin, ArrayList<Integer> distributionRatioList) {
+    public LoadBalanceDefinition weighted(boolean roundRobin, String distributionRatio) {
         WeightedLoadBalancer weighted;
+        List<Integer> distributionRatioList = new ArrayList<Integer>();
+        
+        String[] ratios = distributionRatio.split(":");
+        for (String ratio : ratios) {
+            distributionRatioList.add(new Integer(ratio));
+        }
+        
+        if (!roundRobin) {
+            weighted = new WeightedRandomLoadBalancer(distributionRatioList);
+        } else {
+            weighted = new WeightedRoundRobinLoadBalancer(distributionRatioList);
+        }
+        loadBalancerType = new LoadBalancerDefinition(weighted);
+        return this;
+    }
+    
+    /**
+     * Uses weighted load balancer
+     *
+     * @param roundRobin                   used to set the processor selection algorithm.
+     * @param distributionRatio            String of weighted ratios for distribution of messages.
+     * @param distributionRatioDelimiter   String containing delimiter to be used for ratios
+     * @return the builder
+     */
+    public LoadBalanceDefinition weighted(boolean roundRobin, String distributionRatio, String distributionRatioDelimiter) {
+        WeightedLoadBalancer weighted;
+        List<Integer> distributionRatioList = new ArrayList<Integer>();
+        
+        String[] ratios = distributionRatio.split(distributionRatioDelimiter);
+        for (String ratio : ratios) {
+            distributionRatioList.add(new Integer(ratio.trim()));
+        }
+        
         if (!roundRobin) {
             weighted = new WeightedRandomLoadBalancer(distributionRatioList);
         } else {

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/model/loadbalancer/WeightedLoadBalancerDefinition.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/model/loadbalancer/WeightedLoadBalancerDefinition.java?rev=1027242&r1=1027241&r2=1027242&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/model/loadbalancer/WeightedLoadBalancerDefinition.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/model/loadbalancer/WeightedLoadBalancerDefinition.java Mon Oct 25 19:30:43 2010
@@ -44,13 +44,26 @@ public class WeightedLoadBalancerDefinit
     private Boolean roundRobin = Boolean.FALSE;
     
     @XmlAttribute(name = "distributionRatio", required = true)
-    private List<Integer> distributionRatioList = new ArrayList<Integer>();
+    private String distributionRatio;
+    
+    @XmlAttribute(name = "distributionRatioDelimiter", required = false)
+    private String distributionRatioDelimiter;
     
     @Override
     protected LoadBalancer createLoadBalancer(RouteContext routeContext) {
         WeightedLoadBalancer loadBalancer = null;
+        List<Integer> distributionRatioList = new ArrayList<Integer>();
         
         try {
+            if (distributionRatioDelimiter == null) {
+                distributionRatioDelimiter = ":";
+            }
+            
+            String[] ratios = distributionRatio.split(distributionRatioDelimiter);
+            for (String ratio : ratios) {
+                distributionRatioList.add(new Integer(ratio.trim()));
+            }
+            
             if (!roundRobin) {
                 loadBalancer = new WeightedRandomLoadBalancer(distributionRatioList);
             } else {
@@ -70,20 +83,20 @@ public class WeightedLoadBalancerDefinit
         this.roundRobin = roundRobin;
     }
 
-    public List<Integer> getDistributionRatioList() {
-        return distributionRatioList;
+    public String getDistributionRatio() {
+        return distributionRatio;
     }
 
-    public void setDistributionRatioList(List<Integer> distributionRatioList) {
-        this.distributionRatioList = distributionRatioList;
+    public void setDistributionRatioList(String distributionRatio) {
+        this.distributionRatio = distributionRatio;
     }
 
     @Override
     public String toString() {
         if (!roundRobin) { 
-            return "WeightedRandomLoadBalancer[" + distributionRatioList + "]";
+            return "WeightedRandomLoadBalancer[" + distributionRatio + "]";
         } else {
-            return "WeightedRoundRobinLoadBalancer[" + distributionRatioList + "]";
+            return "WeightedRoundRobinLoadBalancer[" + distributionRatio + "]";
         }
     }
 }

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/processor/loadbalancer/WeightedLoadBalancer.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/loadbalancer/WeightedLoadBalancer.java?rev=1027242&r1=1027241&r2=1027242&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/processor/loadbalancer/WeightedLoadBalancer.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/processor/loadbalancer/WeightedLoadBalancer.java Mon Oct 25 19:30:43 2010
@@ -19,6 +19,7 @@ package org.apache.camel.processor.loadb
 import java.util.ArrayList;
 import java.util.List;
 
+import org.apache.camel.CamelException;
 import org.apache.camel.Processor;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -39,6 +40,19 @@ public abstract class WeightedLoadBalanc
         }
     }
     
+    
+    /* (non-Javadoc)
+     * @see org.apache.camel.processor.loadbalancer.LoadBalancerSupport#doStart()
+     */
+    @Override
+    protected void doStart() throws Exception {
+        
+        super.doStart();
+        if (getProcessors().size() != getDistributionRatioList().size()) {
+            throw new CamelException("Listed Load Balance Processors do not match Distribution Ratio.");
+        }
+    }
+
     protected void loadRuntimeRatios(List<Integer> distributionRatios) {
         int position = 0;
         
@@ -46,24 +60,6 @@ public abstract class WeightedLoadBalanc
             runtimeRatios.add(new DistributionRatio(position++, value.intValue()));
         }
     }
-
-    protected void normalizeDistributionListAgainstProcessors(List<Processor> processors) {
-        if (processors.size() > getDistributionRatioList().size()) {
-            if (LOG.isWarnEnabled()) {
-                LOG.warn("Listed Load Balance Processors do not match distributionRatio. Best Effort distribution will be attempted");
-                LOG.warn("Number of Processors: " + processors.size() + ". Number of DistibutionRatioList elements: " + getDistributionRatioList().size());
-            }
-        } else if (processors.size() < getDistributionRatioList().size()) {
-            if (LOG.isWarnEnabled()) {
-                LOG.warn("Listed Load Balance Processors do not match distributionRatio. Best Effort distribution will be attempted");
-                LOG.warn("Number of Processors: " + processors.size() + ". Number of DistibutionRatioList elements: " + getDistributionRatioList().size());
-            }
-            for (int i = processors.size(); i < getDistributionRatioList().size(); i++) {
-                getDistributionRatioList().set(i, 0);
-                getRuntimeRatios().remove(i);
-            }
-        }        
-    }
     
     protected boolean isRuntimeRatiosZeroed() {
         boolean cleared = true;

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/processor/loadbalancer/WeightedRandomLoadBalancer.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/loadbalancer/WeightedRandomLoadBalancer.java?rev=1027242&r1=1027241&r2=1027242&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/processor/loadbalancer/WeightedRandomLoadBalancer.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/processor/loadbalancer/WeightedRandomLoadBalancer.java Mon Oct 25 19:30:43 2010
@@ -36,8 +36,6 @@ public class WeightedRandomLoadBalancer 
     protected Processor chooseProcessor(List<Processor> processors,
             Exchange exchange) {
         
-        normalizeDistributionListAgainstProcessors(processors);
-        
         boolean found = false;
         
         while (!found) {

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/processor/loadbalancer/WeightedRoundRobinLoadBalancer.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/loadbalancer/WeightedRoundRobinLoadBalancer.java?rev=1027242&r1=1027241&r2=1027242&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/processor/loadbalancer/WeightedRoundRobinLoadBalancer.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/processor/loadbalancer/WeightedRoundRobinLoadBalancer.java Mon Oct 25 19:30:43 2010
@@ -34,8 +34,6 @@ public class WeightedRoundRobinLoadBalan
     @Override
     protected Processor chooseProcessor(List<Processor> processors,
             Exchange exchange) {
-        
-        normalizeDistributionListAgainstProcessors(processors);
             
         if (isRuntimeRatiosZeroed())  {
             resetRuntimeRatios();

Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/processor/WeightedRandomLoadBalanceTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/WeightedRandomLoadBalanceTest.java?rev=1027242&r1=1027241&r2=1027242&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/processor/WeightedRandomLoadBalanceTest.java (original)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/processor/WeightedRandomLoadBalanceTest.java Mon Oct 25 19:30:43 2010
@@ -19,6 +19,7 @@ package org.apache.camel.processor;
 import java.util.ArrayList;
 import java.util.List;
 
+import org.apache.camel.CamelException;
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
@@ -54,14 +55,10 @@ public class WeightedRandomLoadBalanceTe
 
         context.addRoutes(new RouteBuilder() {
             public void configure() {
-                ArrayList<Integer> distributionRatio = new ArrayList<Integer>();
-                distributionRatio.add(4);
-                distributionRatio.add(2);
-                distributionRatio.add(1);
                 
                 // START SNIPPET: example
                 from("direct:start").loadBalance().
-                weighted(false, distributionRatio).to("mock:x", "mock:y", "mock:z");
+                weighted(false, "4:2:1").to("mock:x", "mock:y", "mock:z");
                 // END SNIPPET: example
             }
         });
@@ -80,14 +77,10 @@ public class WeightedRandomLoadBalanceTe
 
         context.addRoutes(new RouteBuilder() {
             public void configure() {
-                ArrayList<Integer> distributionRatio = new ArrayList<Integer>();
-                distributionRatio.add(2);
-                distributionRatio.add(1);
-                distributionRatio.add(3);
                 
                 // START SNIPPET: example
                 from("direct:start").loadBalance().
-                weighted(false, distributionRatio).to("mock:x", "mock:y", "mock:z");
+                weighted(false, "2, 1, 3", ",").to("mock:x", "mock:y", "mock:z");
                 // END SNIPPET: example
             }
         });
@@ -106,14 +99,10 @@ public class WeightedRandomLoadBalanceTe
 
         context.addRoutes(new RouteBuilder() {
             public void configure() {
-                ArrayList<Integer> distributionRatio = new ArrayList<Integer>();
-                distributionRatio.add(2);
-                distributionRatio.add(3);
-                distributionRatio.add(5);
                 
                 // START SNIPPET: example
                 from("direct:start").loadBalance().
-                weighted(false, distributionRatio).to("mock:x", "mock:y", "mock:z");
+                weighted(false, "2-3-5", "-").to("mock:x", "mock:y", "mock:z");
                 // END SNIPPET: example
             }
         });
@@ -124,6 +113,28 @@ public class WeightedRandomLoadBalanceTe
         assertMockEndpointsSatisfied();
     }
     
+    public void testUnmatchedRatiosToProcessors() throws Exception {
+        boolean error = false;
+        
+        try {
+            context.addRoutes(new RouteBuilder() {
+                public void configure() {
+                    
+                    // START SNIPPET: example
+                    from("direct:start").loadBalance().
+                    weighted(false, "2:3").to("mock:x", "mock:y", "mock:z");
+                    // END SNIPPET: example
+                }
+            });
+            context.start();
+        } catch (CamelException e) {
+            assertEquals("Listed Load Balance Processors do not match Distribution Ratio.", e.getMessage());
+            error = true;
+        }
+
+        assertTrue(error);
+    }
+    
     protected void sendBulkMessages(int number) {
         for (int i = 0; i < number; i++) {
             template.sendBodyAndHeader("direct:start", createTestMessage(i), "counter", i);

Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/processor/WeightedRoundRobinLoadBalanceTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/WeightedRoundRobinLoadBalanceTest.java?rev=1027242&r1=1027241&r2=1027242&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/processor/WeightedRoundRobinLoadBalanceTest.java (original)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/processor/WeightedRoundRobinLoadBalanceTest.java Mon Oct 25 19:30:43 2010
@@ -19,6 +19,7 @@ package org.apache.camel.processor;
 import java.util.ArrayList;
 import java.util.List;
 
+import org.apache.camel.CamelException;
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
@@ -55,14 +56,9 @@ public class WeightedRoundRobinLoadBalan
 
         context.addRoutes(new RouteBuilder() {
             public void configure() {
-                ArrayList<Integer> distributionRatio = new ArrayList<Integer>();
-                distributionRatio.add(4);
-                distributionRatio.add(2);
-                distributionRatio.add(1);
-                
                 // START SNIPPET: example
                 from("direct:start").loadBalance().
-                weighted(true, distributionRatio).to("mock:x", "mock:y", "mock:z");
+                weighted(true, "4:2:1").to("mock:x", "mock:y", "mock:z");
                 // END SNIPPET: example
             }
         });
@@ -84,14 +80,10 @@ public class WeightedRoundRobinLoadBalan
 
         context.addRoutes(new RouteBuilder() {
             public void configure() {
-                ArrayList<Integer> distributionRatio = new ArrayList<Integer>();
-                distributionRatio.add(2);
-                distributionRatio.add(1);
-                distributionRatio.add(3);
                 
                 // START SNIPPET: example
                 from("direct:start").loadBalance().
-                weighted(true, distributionRatio).to("mock:x", "mock:y", "mock:z");
+                weighted(true, "2, 1, 3", ",").to("mock:x", "mock:y", "mock:z");
                 // END SNIPPET: example
             }
         });
@@ -113,14 +105,9 @@ public class WeightedRoundRobinLoadBalan
 
         context.addRoutes(new RouteBuilder() {
             public void configure() {
-                ArrayList<Integer> distributionRatio = new ArrayList<Integer>();
-                distributionRatio.add(2);
-                distributionRatio.add(3);
-                distributionRatio.add(5);
-                
                 // START SNIPPET: example
                 from("direct:start").loadBalance().
-                weighted(true, distributionRatio).to("mock:x", "mock:y", "mock:z");
+                weighted(true, "2-3-5", "-").to("mock:x", "mock:y", "mock:z");
                 // END SNIPPET: example
             }
         });
@@ -131,6 +118,28 @@ public class WeightedRoundRobinLoadBalan
         assertMockEndpointsSatisfied();
     }
     
+    public void testUnmatchedRatiosToProcessors() throws Exception {
+        boolean error = false;
+        
+        try {
+            context.addRoutes(new RouteBuilder() {
+                public void configure() {
+                    
+                    // START SNIPPET: example
+                    from("direct:start").loadBalance().
+                    weighted(true, "2:3").to("mock:x", "mock:y", "mock:z");
+                    // END SNIPPET: example
+                }
+            });
+            context.start();
+        } catch (CamelException e) {
+            assertEquals("Listed Load Balance Processors do not match Distribution Ratio.", e.getMessage());
+            error = true;
+        }
+
+        assertTrue(error);
+    }
+    
     protected void sendBulkMessages(int number) {
         for (int i = 0; i < number; i++) {
             template.sendBodyAndHeader("direct:start", createTestMessage(i), "counter", i);

Modified: camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/weightedRandomLoadBalance.xml
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/weightedRandomLoadBalance.xml?rev=1027242&r1=1027241&r2=1027242&view=diff
==============================================================================
--- camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/weightedRandomLoadBalance.xml (original)
+++ camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/weightedRandomLoadBalance.xml Mon Oct 25 19:30:43 2010
@@ -29,7 +29,7 @@
     <route>
       <from uri="direct:start"/>
       <loadBalance>
-        <weighted roundRobin="false" distributionRatio="4 2 1"/>
+        <weighted roundRobin="false" distributionRatio="4, 2, 1" distributionRatioDelimiter="," />
           <to uri="mock:x"/>
           <to uri="mock:y"/>
           <to uri="mock:z"/>

Modified: camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/weightedRoundRobinLoadBalance.xml
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/weightedRoundRobinLoadBalance.xml?rev=1027242&r1=1027241&r2=1027242&view=diff
==============================================================================
--- camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/weightedRoundRobinLoadBalance.xml (original)
+++ camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/weightedRoundRobinLoadBalance.xml Mon Oct 25 19:30:43 2010
@@ -29,7 +29,7 @@
     <route>
       <from uri="direct:start"/>
       <loadBalance>
-        <weighted roundRobin="true" distributionRatio="4 2 1"/>
+        <weighted roundRobin="true" distributionRatio="4:2:1"/>
           <to uri="mock:x"/>
           <to uri="mock:y"/>
           <to uri="mock:z"/>