Repository: camel Updated Branches: refs/heads/master 5b27ecc8a -> ea6d2fcc1
CAMEL-8684: Fixed load balancer model to not implement LoadBalancer/Processor as that is runtime. Also ensure Java DSL build the routes using the model classes instead of cheating. Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/ea6d2fcc Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/ea6d2fcc Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/ea6d2fcc Branch: refs/heads/master Commit: ea6d2fcc19acd3ed283c82c4076720b05acde016 Parents: 5b27ecc Author: Claus Ibsen <davscl...@apache.org> Authored: Wed Apr 22 14:29:31 2015 +0200 Committer: Claus Ibsen <davscl...@apache.org> Committed: Wed Apr 22 15:07:18 2015 +0200 ---------------------------------------------------------------------- .../camel/model/LoadBalanceDefinition.java | 57 ++++++++------------ .../camel/model/LoadBalancerDefinition.java | 41 +------------- .../CircuitBreakerLoadBalancerDefinition.java | 27 ++++++++-- .../FailoverLoadBalancerDefinition.java | 31 +++++++++-- .../DoubleLoadBalancerMisconfigurationTest.java | 6 +-- 5 files changed, 75 insertions(+), 87 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/ea6d2fcc/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 05fc76b..c2d8291 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 @@ -38,16 +38,7 @@ import org.apache.camel.model.loadbalancer.RoundRobinLoadBalancerDefinition; import org.apache.camel.model.loadbalancer.StickyLoadBalancerDefinition; import org.apache.camel.model.loadbalancer.TopicLoadBalancerDefinition; import org.apache.camel.model.loadbalancer.WeightedLoadBalancerDefinition; -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; -import org.apache.camel.processor.loadbalancer.TopicLoadBalancer; -import org.apache.camel.processor.loadbalancer.WeightedLoadBalancer; -import org.apache.camel.processor.loadbalancer.WeightedRandomLoadBalancer; -import org.apache.camel.processor.loadbalancer.WeightedRoundRobinLoadBalancer; import org.apache.camel.spi.Metadata; import org.apache.camel.spi.RouteContext; import org.apache.camel.util.CollectionStringBuffer; @@ -204,10 +195,11 @@ public class LoadBalanceDefinition extends ProcessorDefinition<LoadBalanceDefini * @return the builder */ public LoadBalanceDefinition failover(int maximumFailoverAttempts, boolean inheritErrorHandler, boolean roundRobin, Class<?>... exceptions) { - FailOverLoadBalancer failover = new FailOverLoadBalancer(Arrays.asList(exceptions)); - failover.setMaximumFailoverAttempts(maximumFailoverAttempts); - failover.setRoundRobin(roundRobin); - setLoadBalancerType(new LoadBalancerDefinition(failover)); + FailoverLoadBalancerDefinition def = new FailoverLoadBalancerDefinition(); + def.setExceptionTypes(Arrays.asList(exceptions)); + def.setMaximumFailoverAttempts(maximumFailoverAttempts); + def.setRoundRobin(roundRobin); + setLoadBalancerType(def); this.setInheritErrorHandler(inheritErrorHandler); return this; } @@ -232,11 +224,11 @@ public class LoadBalanceDefinition extends ProcessorDefinition<LoadBalanceDefini * @return the builder */ public LoadBalanceDefinition circuitBreaker(int threshold, long halfOpenAfter, Class<?>... exceptions) { - CircuitBreakerLoadBalancer breakerLoadBalancer = new CircuitBreakerLoadBalancer(Arrays.asList(exceptions)); - breakerLoadBalancer.setThreshold(threshold); - breakerLoadBalancer.setHalfOpenAfter(halfOpenAfter); - - setLoadBalancerType(new LoadBalancerDefinition(breakerLoadBalancer)); + CircuitBreakerLoadBalancerDefinition def = new CircuitBreakerLoadBalancerDefinition(); + def.setExceptionTypes(Arrays.asList(exceptions)); + def.setThreshold(threshold); + def.setHalfOpenAfter(halfOpenAfter); + setLoadBalancerType(def); return this; } @@ -249,20 +241,11 @@ public class LoadBalanceDefinition extends ProcessorDefinition<LoadBalanceDefini * @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 { - weighted = new WeightedRoundRobinLoadBalancer(distributionRatioList); - } - setLoadBalancerType(new LoadBalancerDefinition(weighted)); + WeightedLoadBalancerDefinition def = new WeightedLoadBalancerDefinition(); + def.setRoundRobin(roundRobin); + def.setDistributionRatio(distributionRatio); + def.setDistributionRatioDelimiter(distributionRatioDelimiter); + setLoadBalancerType(def); return this; } @@ -272,7 +255,7 @@ public class LoadBalanceDefinition extends ProcessorDefinition<LoadBalanceDefini * @return the builder */ public LoadBalanceDefinition roundRobin() { - setLoadBalancerType(new LoadBalancerDefinition(new RoundRobinLoadBalancer())); + setLoadBalancerType(new RoundRobinLoadBalancerDefinition()); return this; } @@ -282,7 +265,7 @@ public class LoadBalanceDefinition extends ProcessorDefinition<LoadBalanceDefini * @return the builder */ public LoadBalanceDefinition random() { - setLoadBalancerType(new LoadBalancerDefinition(new RandomLoadBalancer())); + setLoadBalancerType(new RandomLoadBalancerDefinition()); return this; } @@ -306,7 +289,9 @@ public class LoadBalanceDefinition extends ProcessorDefinition<LoadBalanceDefini * @return the builder */ public LoadBalanceDefinition sticky(Expression correlationExpression) { - setLoadBalancerType(new LoadBalancerDefinition(new StickyLoadBalancer(correlationExpression))); + StickyLoadBalancerDefinition def = new StickyLoadBalancerDefinition(); + def.setCorrelationExpression(new ExpressionSubElementDefinition(correlationExpression)); + setLoadBalancerType(def); return this; } @@ -316,7 +301,7 @@ public class LoadBalanceDefinition extends ProcessorDefinition<LoadBalanceDefini * @return the builder */ public LoadBalanceDefinition topic() { - setLoadBalancerType(new LoadBalancerDefinition(new TopicLoadBalancer())); + setLoadBalancerType(new TopicLoadBalancerDefinition()); return this; } http://git-wip-us.apache.org/repos/asf/camel/blob/ea6d2fcc/camel-core/src/main/java/org/apache/camel/model/LoadBalancerDefinition.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/model/LoadBalancerDefinition.java b/camel-core/src/main/java/org/apache/camel/model/LoadBalancerDefinition.java index 2724126..c5a99fd 100644 --- a/camel-core/src/main/java/org/apache/camel/model/LoadBalancerDefinition.java +++ b/camel-core/src/main/java/org/apache/camel/model/LoadBalancerDefinition.java @@ -16,15 +16,11 @@ */ package org.apache.camel.model; -import java.util.List; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; -import org.apache.camel.AsyncCallback; -import org.apache.camel.Exchange; -import org.apache.camel.Processor; import org.apache.camel.processor.loadbalancer.LoadBalancer; import org.apache.camel.spi.Metadata; import org.apache.camel.spi.RouteContext; @@ -37,7 +33,7 @@ import org.apache.camel.util.ObjectHelper; @Metadata(label = "eip,routing") @XmlType(name = "loadBalancer") @XmlAccessorType(XmlAccessType.FIELD) -public class LoadBalancerDefinition extends IdentifiedType implements LoadBalancer { +public class LoadBalancerDefinition extends IdentifiedType { @XmlTransient private LoadBalancer loadBalancer; @XmlTransient @@ -108,41 +104,6 @@ public class LoadBalancerDefinition extends IdentifiedType implements LoadBalanc return null; } - - public void addProcessor(Processor processor) { - ObjectHelper.notNull(loadBalancer, "loadBalancer", this); - loadBalancer.addProcessor(processor); - } - - public List<Processor> getProcessors() { - ObjectHelper.notNull(loadBalancer, "loadBalancer", this); - return loadBalancer.getProcessors(); - } - - public void removeProcessor(Processor processor) { - ObjectHelper.notNull(loadBalancer, "loadBalancer", this); - loadBalancer.removeProcessor(processor); - } - - public void process(Exchange exchange) throws Exception { - ObjectHelper.notNull(loadBalancer, "loadBalancer", this); - loadBalancer.process(exchange); - } - - public boolean process(Exchange exchange, final AsyncCallback callback) { - ObjectHelper.notNull(loadBalancer, "loadBalancer"); - return loadBalancer.process(exchange, new AsyncCallback() { - public void done(boolean doneSync) { - // only handle the async case - if (doneSync) { - return; - } else { - callback.done(false); - } - } - }); - } - @Override public String toString() { if (loadBalancer != null) { http://git-wip-us.apache.org/repos/asf/camel/blob/ea6d2fcc/camel-core/src/main/java/org/apache/camel/model/loadbalancer/CircuitBreakerLoadBalancerDefinition.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/model/loadbalancer/CircuitBreakerLoadBalancerDefinition.java b/camel-core/src/main/java/org/apache/camel/model/loadbalancer/CircuitBreakerLoadBalancerDefinition.java index acedd6f..54b2a7d 100644 --- a/camel-core/src/main/java/org/apache/camel/model/loadbalancer/CircuitBreakerLoadBalancerDefinition.java +++ b/camel-core/src/main/java/org/apache/camel/model/loadbalancer/CircuitBreakerLoadBalancerDefinition.java @@ -23,6 +23,7 @@ import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlTransient; import org.apache.camel.model.LoadBalancerDefinition; import org.apache.camel.processor.loadbalancer.CircuitBreakerLoadBalancer; @@ -44,6 +45,8 @@ import org.apache.camel.util.ObjectHelper; @XmlRootElement(name = "circuitBreaker") @XmlAccessorType(XmlAccessType.FIELD) public class CircuitBreakerLoadBalancerDefinition extends LoadBalancerDefinition { + @XmlTransient + private List<Class<?>> exceptionTypes = new ArrayList<Class<?>>(); @XmlElement(name = "exception") private List<String> exceptions = new ArrayList<String>(); @XmlAttribute @@ -58,8 +61,10 @@ public class CircuitBreakerLoadBalancerDefinition extends LoadBalancerDefinition protected LoadBalancer createLoadBalancer(RouteContext routeContext) { CircuitBreakerLoadBalancer answer; - if (!exceptions.isEmpty()) { - List<Class<?>> classes = new ArrayList<Class<?>>(); + List<Class<?>> classes = new ArrayList<Class<?>>(); + if (!exceptionTypes.isEmpty()) { + classes.addAll(exceptionTypes); + } else if (!exceptions.isEmpty()) { for (String name : exceptions) { Class<?> type = routeContext.getCamelContext().getClassResolver().resolveClass(name); if (type == null) { @@ -70,9 +75,11 @@ public class CircuitBreakerLoadBalancerDefinition extends LoadBalancerDefinition } classes.add(type); } - answer = new CircuitBreakerLoadBalancer(classes); - } else { + } + if (classes.isEmpty()) { answer = new CircuitBreakerLoadBalancer(); + } else { + answer = new CircuitBreakerLoadBalancer(classes); } if (getHalfOpenAfter() != null) { @@ -118,6 +125,18 @@ public class CircuitBreakerLoadBalancerDefinition extends LoadBalancerDefinition this.exceptions = exceptions; } + public List<Class<?>> getExceptionTypes() { + return exceptionTypes; + } + + /** + * A list of specific exceptions to monitor. + * If no exceptions is configured then all exceptions is monitored + */ + public void setExceptionTypes(List<Class<?>> exceptionTypes) { + this.exceptionTypes = exceptionTypes; + } + @Override public String toString() { return "CircuitBreakerLoadBalancer"; http://git-wip-us.apache.org/repos/asf/camel/blob/ea6d2fcc/camel-core/src/main/java/org/apache/camel/model/loadbalancer/FailoverLoadBalancerDefinition.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/model/loadbalancer/FailoverLoadBalancerDefinition.java b/camel-core/src/main/java/org/apache/camel/model/loadbalancer/FailoverLoadBalancerDefinition.java index f68db8c..523f794 100644 --- a/camel-core/src/main/java/org/apache/camel/model/loadbalancer/FailoverLoadBalancerDefinition.java +++ b/camel-core/src/main/java/org/apache/camel/model/loadbalancer/FailoverLoadBalancerDefinition.java @@ -23,12 +23,14 @@ import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlTransient; import org.apache.camel.model.LoadBalancerDefinition; import org.apache.camel.processor.loadbalancer.FailOverLoadBalancer; import org.apache.camel.processor.loadbalancer.LoadBalancer; import org.apache.camel.spi.Metadata; import org.apache.camel.spi.RouteContext; +import org.apache.camel.util.ObjectHelper; /** * Failover load balancer @@ -42,6 +44,8 @@ import org.apache.camel.spi.RouteContext; @XmlRootElement(name = "failover") @XmlAccessorType(XmlAccessType.FIELD) public class FailoverLoadBalancerDefinition extends LoadBalancerDefinition { + @XmlTransient + private List<Class<?>> exceptionTypes = new ArrayList<Class<?>>(); @XmlElement(name = "exception") private List<String> exceptions = new ArrayList<String>(); @XmlAttribute @@ -56,18 +60,25 @@ public class FailoverLoadBalancerDefinition extends LoadBalancerDefinition { protected LoadBalancer createLoadBalancer(RouteContext routeContext) { FailOverLoadBalancer answer; - if (!exceptions.isEmpty()) { - List<Class<?>> classes = new ArrayList<Class<?>>(); + List<Class<?>> classes = new ArrayList<Class<?>>(); + if (!exceptionTypes.isEmpty()) { + classes.addAll(exceptionTypes); + } else if (!exceptions.isEmpty()) { for (String name : exceptions) { Class<?> type = routeContext.getCamelContext().getClassResolver().resolveClass(name); if (type == null) { throw new IllegalArgumentException("Cannot find class: " + name + " in the classpath"); } + if (!ObjectHelper.isAssignableFrom(Throwable.class, type)) { + throw new IllegalArgumentException("Class is not an instance of Throwable: " + type); + } classes.add(type); } - answer = new FailOverLoadBalancer(classes); - } else { + } + if (classes.isEmpty()) { answer = new FailOverLoadBalancer(); + } else { + answer = new FailOverLoadBalancer(classes); } if (getMaximumFailoverAttempts() != null) { @@ -92,6 +103,18 @@ public class FailoverLoadBalancerDefinition extends LoadBalancerDefinition { this.exceptions = exceptions; } + public List<Class<?>> getExceptionTypes() { + return exceptionTypes; + } + + /** + * A list of specific exceptions to monitor. + * If no exceptions is configured then all exceptions is monitored + */ + public void setExceptionTypes(List<Class<?>> exceptionTypes) { + this.exceptionTypes = exceptionTypes; + } + public Boolean getRoundRobin() { return roundRobin; } http://git-wip-us.apache.org/repos/asf/camel/blob/ea6d2fcc/camel-core/src/test/java/org/apache/camel/processor/DoubleLoadBalancerMisconfigurationTest.java ---------------------------------------------------------------------- diff --git a/camel-core/src/test/java/org/apache/camel/processor/DoubleLoadBalancerMisconfigurationTest.java b/camel-core/src/test/java/org/apache/camel/processor/DoubleLoadBalancerMisconfigurationTest.java index 0942969..a23c172 100644 --- a/camel-core/src/test/java/org/apache/camel/processor/DoubleLoadBalancerMisconfigurationTest.java +++ b/camel-core/src/test/java/org/apache/camel/processor/DoubleLoadBalancerMisconfigurationTest.java @@ -41,7 +41,7 @@ public class DoubleLoadBalancerMisconfigurationTest extends ContextTestSupport { }); fail("Should have thrown an exception"); } catch (IllegalArgumentException e) { - assertEquals("Loadbalancer already configured to: FailoverLoadBalancer[[]]. Cannot set it to: RoundRobinLoadBalancer", e.getMessage()); + assertEquals("Loadbalancer already configured to: FailoverLoadBalancer. Cannot set it to: RoundRobinLoadBalancer", e.getMessage()); } } @@ -57,7 +57,7 @@ public class DoubleLoadBalancerMisconfigurationTest extends ContextTestSupport { }); fail("Should have thrown an exception"); } catch (IllegalArgumentException e) { - assertEquals("Loadbalancer already configured to: FailoverLoadBalancer[[]]. Cannot set it to: RandomLoadBalancer", e.getMessage()); + assertEquals("Loadbalancer already configured to: FailoverLoadBalancer. Cannot set it to: RandomLoadBalancer", e.getMessage()); } } @@ -73,7 +73,7 @@ public class DoubleLoadBalancerMisconfigurationTest extends ContextTestSupport { }); fail("Should have thrown an exception"); } catch (IllegalArgumentException e) { - assertEquals("Loadbalancer already configured to: RandomLoadBalancer. Cannot set it to: FailoverLoadBalancer[[]]", e.getMessage()); + assertEquals("Loadbalancer already configured to: RandomLoadBalancer. Cannot set it to: FailoverLoadBalancer", e.getMessage()); } } }