Repository: camel Updated Branches: refs/heads/master b43bdffe7 -> 0b22a495c
CAMEL-9011: Circuit breaker LB only allow 1 output. Add validation check. Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/0b22a495 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/0b22a495 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/0b22a495 Branch: refs/heads/master Commit: 0b22a495ce0830c9482a0b3a42e6a0e5db23d99e Parents: b43bdff Author: Claus Ibsen <davscl...@apache.org> Authored: Fri Jul 24 14:24:03 2015 +0200 Committer: Claus Ibsen <davscl...@apache.org> Committed: Fri Jul 24 14:24:03 2015 +0200 ---------------------------------------------------------------------- .../camel/model/LoadBalanceDefinition.java | 8 ++++ .../camel/model/LoadBalancerDefinition.java | 7 +++ .../CircuitBreakerLoadBalancerDefinition.java | 6 +++ .../CircuitBreakerLoadBalancerInvalidTest.java | 49 ++++++++++++++++++++ .../CircuitBreakerLoadBalancerTest.java | 1 - 5 files changed, 70 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/0b22a495/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 ecb7145..4539c6c 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 @@ -106,6 +106,14 @@ public class LoadBalanceDefinition extends ProcessorDefinition<LoadBalanceDefini // then create it and reuse it loadBalancer = loadBalancerType.createLoadBalancer(routeContext); loadBalancerType.setLoadBalancer(loadBalancer); + + // some load balancers can only support a fixed number of outputs + int max = loadBalancerType.getMaximumNumberOfOutputs(); + int size = getOutputs().size(); + if (size > max) { + throw new IllegalArgumentException("To many outputs configured on " + loadBalancerType + ": " + size + " > " + max); + } + for (ProcessorDefinition<?> processorType : getOutputs()) { // output must not be another load balancer // check for instanceof as the code below as there is compilation errors on earlier versions of JDK6 http://git-wip-us.apache.org/repos/asf/camel/blob/0b22a495/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 7ef9cb3..4d4a37c 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 @@ -62,6 +62,13 @@ public class LoadBalancerDefinition extends IdentifiedType { } /** + * Maximum number of outputs, as some load balancers only support 1 processor + */ + protected int getMaximumNumberOfOutputs() { + return Integer.MAX_VALUE; + } + + /** * Allows derived classes to customize the load balancer */ protected void configureLoadBalancer(LoadBalancer loadBalancer) { http://git-wip-us.apache.org/repos/asf/camel/blob/0b22a495/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 54b2a7d..5c26b35 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 @@ -58,6 +58,12 @@ public class CircuitBreakerLoadBalancerDefinition extends LoadBalancerDefinition } @Override + protected int getMaximumNumberOfOutputs() { + // we can only support 1 output + return 1; + } + + @Override protected LoadBalancer createLoadBalancer(RouteContext routeContext) { CircuitBreakerLoadBalancer answer; http://git-wip-us.apache.org/repos/asf/camel/blob/0b22a495/camel-core/src/test/java/org/apache/camel/processor/CircuitBreakerLoadBalancerInvalidTest.java ---------------------------------------------------------------------- diff --git a/camel-core/src/test/java/org/apache/camel/processor/CircuitBreakerLoadBalancerInvalidTest.java b/camel-core/src/test/java/org/apache/camel/processor/CircuitBreakerLoadBalancerInvalidTest.java new file mode 100644 index 0000000..63563f8 --- /dev/null +++ b/camel-core/src/test/java/org/apache/camel/processor/CircuitBreakerLoadBalancerInvalidTest.java @@ -0,0 +1,49 @@ +/** + * 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.processor; + +import java.io.IOException; + +import org.apache.camel.ContextTestSupport; +import org.apache.camel.FailedToCreateRouteException; +import org.apache.camel.builder.RouteBuilder; + +public class CircuitBreakerLoadBalancerInvalidTest extends ContextTestSupport { + + @Override + public boolean isUseRouteBuilder() { + return false; + } + + public void testInvalid() throws Exception { + context.addRoutes(new RouteBuilder() { + @Override + public void configure() throws Exception { + from("direct:start") + .loadBalance().circuitBreaker(2, 5000, IOException.class) + .to("mock:a").to("mock:b"); + } + }); + try { + context.start(); + fail("should fail"); + } catch (FailedToCreateRouteException e) { + assertEquals("To many outputs configured on CircuitBreakerLoadBalancer: 2 > 1", e.getCause().getMessage()); + } + } + +} http://git-wip-us.apache.org/repos/asf/camel/blob/0b22a495/camel-core/src/test/java/org/apache/camel/processor/CircuitBreakerLoadBalancerTest.java ---------------------------------------------------------------------- diff --git a/camel-core/src/test/java/org/apache/camel/processor/CircuitBreakerLoadBalancerTest.java b/camel-core/src/test/java/org/apache/camel/processor/CircuitBreakerLoadBalancerTest.java index 3607ae8..1b6cccc 100644 --- a/camel-core/src/test/java/org/apache/camel/processor/CircuitBreakerLoadBalancerTest.java +++ b/camel-core/src/test/java/org/apache/camel/processor/CircuitBreakerLoadBalancerTest.java @@ -185,7 +185,6 @@ public class CircuitBreakerLoadBalancerTest extends ContextTestSupport { assertTrue(exchangeThree.getException() instanceof RejectedExecutionException); assertTrue(exchangeFour.getException() == null); assertTrue(exchangeFive.getException() == null); - } public void testHalfOpenCircuitClosesAfterTimeoutSync() throws Exception {