Author: davsclaus Date: Mon Mar 5 09:23:11 2012 New Revision: 1296974 URL: http://svn.apache.org/viewvc?rev=1296974&view=rev Log: CAMEL-4680: Check for clash with multiple consumers when starting a new route manually using startRoute
Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java camel/trunk/camel-core/src/test/java/org/apache/camel/component/direct/DirectEndpointRouteInlinedTest.java camel/trunk/camel-core/src/test/java/org/apache/camel/component/seda/SedaConcurrentConsumersNPEIssueTest.java camel/trunk/camel-core/src/test/java/org/apache/camel/view/DotViewTest.java camel/trunk/camel-core/src/test/java/org/apache/camel/view/XmlGraphTest.java Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java?rev=1296974&r1=1296973&r2=1296974&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java Mon Mar 5 09:23:11 2012 @@ -1963,11 +1963,30 @@ public class DefaultCamelContext extends for (Consumer consumer : routeService.getInputs().values()) { Endpoint endpoint = consumer.getEndpoint(); - // check multiple consumer violation + // check multiple consumer violation, with the other routes to be started if (!doCheckMultipleConsumerSupportClash(endpoint, routeInputs)) { throw new FailedToStartRouteException(routeService.getId(), "Multiple consumers for the same endpoint is not allowed: " + endpoint); } + + // check for multiple consumer violations with existing routes which + // have already been started, or is currently starting + List<Endpoint> existingEndpoints = new ArrayList<Endpoint>(); + for (Route existingRoute : getRoutes()) { + if (route.getId().equals(existingRoute.getId())) { + // skip ourselves + continue; + } + Endpoint existing = existingRoute.getEndpoint(); + ServiceStatus status = getRouteStatus(existingRoute.getId()); + if (status != null && status.isStarted() || status.isStarting()) { + existingEndpoints.add(existing); + } + } + if (!doCheckMultipleConsumerSupportClash(endpoint, existingEndpoints)) { + throw new FailedToStartRouteException(routeService.getId(), + "Multiple consumers for the same endpoint is not allowed: " + endpoint); + } // start the consumer on the route log.debug("Route: {} >>> {}", route.getId(), route); Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/component/direct/DirectEndpointRouteInlinedTest.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/component/direct/DirectEndpointRouteInlinedTest.java?rev=1296974&r1=1296973&r2=1296974&view=diff ============================================================================== --- camel/trunk/camel-core/src/test/java/org/apache/camel/component/direct/DirectEndpointRouteInlinedTest.java (original) +++ camel/trunk/camel-core/src/test/java/org/apache/camel/component/direct/DirectEndpointRouteInlinedTest.java Mon Mar 5 09:23:11 2012 @@ -17,6 +17,7 @@ package org.apache.camel.component.direct; import org.apache.camel.ContextTestSupport; +import org.apache.camel.FailedToStartRouteException; import org.apache.camel.builder.RouteBuilder; /** @@ -54,8 +55,8 @@ public class DirectEndpointRouteInlinedT } }); fail("Should have thrown exception"); - } catch (IllegalArgumentException e) { - assertEquals("Cannot add a 2nd consumer to the same endpoint. Endpoint Endpoint[direct://start] only allows one consumer.", e.getMessage()); + } catch (FailedToStartRouteException e) { + assertEquals("Failed to start route route2 because of Multiple consumers for the same endpoint is not allowed: Endpoint[direct://start]", e.getMessage()); } } Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/component/seda/SedaConcurrentConsumersNPEIssueTest.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/component/seda/SedaConcurrentConsumersNPEIssueTest.java?rev=1296974&r1=1296973&r2=1296974&view=diff ============================================================================== --- camel/trunk/camel-core/src/test/java/org/apache/camel/component/seda/SedaConcurrentConsumersNPEIssueTest.java (original) +++ camel/trunk/camel-core/src/test/java/org/apache/camel/component/seda/SedaConcurrentConsumersNPEIssueTest.java Mon Mar 5 09:23:11 2012 @@ -17,6 +17,7 @@ package org.apache.camel.component.seda; import org.apache.camel.ContextTestSupport; +import org.apache.camel.FailedToStartRouteException; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.component.mock.MockEndpoint; @@ -33,14 +34,33 @@ public class SedaConcurrentConsumersNPEI assertMockEndpointsSatisfied(); - // now start the first route, which should cause a failure due multiple consumers is not allowed - mock.reset(); - mock.expectedMessageCount(0); + try { + context.startRoute("first"); + fail("Should have thrown exception"); + } catch (FailedToStartRouteException e) { + assertEquals("Failed to start route first because of Multiple consumers for the same endpoint is not allowed:" + + " Endpoint[seda://foo?concurrentConsumers=5]", e.getMessage()); + } + } - context.startRoute("first"); - template.sendBody("seda:foo", "Bye World"); + public void testStartThird() throws Exception { + MockEndpoint mock = getMockEndpoint("mock:result"); + mock.expectedBodiesReceived("Hello World"); + + template.sendBody("seda:foo", "Hello World"); assertMockEndpointsSatisfied(); + + // this should be okay + context.startRoute("third"); + + try { + context.startRoute("first"); + fail("Should have thrown exception"); + } catch (FailedToStartRouteException e) { + assertEquals("Failed to start route first because of Multiple consumers for the same endpoint is not allowed:" + + " Endpoint[seda://foo?concurrentConsumers=5]", e.getMessage()); + } } @Override @@ -51,6 +71,8 @@ public class SedaConcurrentConsumersNPEI from("seda:foo?concurrentConsumers=5").routeId("first").noAutoStartup().to("mock:result"); from("seda:foo?concurrentConsumers=5").routeId("second").to("mock:result"); + + from("direct:foo").routeId("third").noAutoStartup().to("mock:result"); } }; } Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/view/DotViewTest.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/view/DotViewTest.java?rev=1296974&r1=1296973&r2=1296974&view=diff ============================================================================== --- camel/trunk/camel-core/src/test/java/org/apache/camel/view/DotViewTest.java (original) +++ camel/trunk/camel-core/src/test/java/org/apache/camel/view/DotViewTest.java Mon Mar 5 09:23:11 2012 @@ -23,7 +23,6 @@ import org.apache.camel.component.bean.M import org.apache.camel.impl.JndiRegistry; import org.apache.camel.processor.aggregate.UseLatestAggregationStrategy; - /** * @version */ @@ -74,7 +73,7 @@ public class DotViewTest extends Context static class AnotherPipelineRoute extends RouteBuilder { public void configure() throws Exception { - from("seda:pipeline.in").pipeline("seda:pipeline.out1", "seda:pipeline.out2", "seda:pipeline.out3"); + from("seda:pipeline.in2").pipeline("seda:pipeline.out1", "seda:pipeline.out2", "seda:pipeline.out3"); } } @@ -86,19 +85,19 @@ public class DotViewTest extends Context static class FromToBeanRoute extends RouteBuilder { public void configure() throws Exception { - from("seda:foo").beanRef("myBean", "hello"); + from("seda:foo2").beanRef("myBean", "hello"); } } static class RoutingSlipRoute extends RouteBuilder { public void configure() throws Exception { - from("seda:foo").routingSlip(header("splipHeader")); + from("seda:foo3").routingSlip(header("splipHeader")); } } static class AggreagateRoute extends RouteBuilder { public void configure() throws Exception { - from("seda:foo") + from("seda:foo4") .aggregate(constant("messageId"), new UseLatestAggregationStrategy()).completionTimeout(1000L). to("seda:aggregated"); } @@ -106,7 +105,7 @@ public class DotViewTest extends Context static class ResequenceRoute extends RouteBuilder { public void configure() throws Exception { - from("seda:foo").resequence(constant("seqNum")).to("seda:bar"); + from("seda:foo5").resequence(constant("seqNum")).to("seda:bar"); } } Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/view/XmlGraphTest.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/view/XmlGraphTest.java?rev=1296974&r1=1296973&r2=1296974&view=diff ============================================================================== --- camel/trunk/camel-core/src/test/java/org/apache/camel/view/XmlGraphTest.java (original) +++ camel/trunk/camel-core/src/test/java/org/apache/camel/view/XmlGraphTest.java Mon Mar 5 09:23:11 2012 @@ -20,6 +20,7 @@ package org.apache.camel.view; * @version */ public class XmlGraphTest extends DotViewTest { + @Override public void testGenerateFiles() throws Exception { XmlGraphGenerator generator = new XmlGraphGenerator(outputDirectory);