You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2012/01/13 16:42:26 UTC

svn commit: r1231135 - in /camel/trunk/camel-core/src: main/java/org/apache/camel/impl/DefaultCamelContext.java test/java/org/apache/camel/impl/DefaultCamelContextAutoStartupTest.java

Author: davsclaus
Date: Fri Jan 13 15:42:25 2012
New Revision: 1231135

URL: http://svn.apache.org/viewvc?rev=1231135&view=rev
Log:
CAMEL-4892: Fixed auto startup on CamelContext should start routes if CamelContext started programmatically later.

Modified:
    camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/impl/DefaultCamelContextAutoStartupTest.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=1231135&r1=1231134&r2=1231135&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 Fri Jan 13 15:42:25 2012
@@ -1368,10 +1368,17 @@ public class DefaultCamelContext extends
         log.info("Apache Camel " + getVersion() + " (CamelContext: " + getName() + ") is starting");
 
         doNotStartRoutesOnFirstStart = !firstStartDone && !isAutoStartup();
-        firstStartDone = true;
+
+        // if the context was configured with auto startup = false, and we are already started,
+        // then we may need to start the routes on the 2nd start call
+        if (firstStartDone && !isAutoStartup() && isStarted()) {
+            // invoke this logic to warmup the routes and if possible also start the routes
+            doStartOrResumeRoutes(routeServices, true, true, false, true);
+        }
 
         // super will invoke doStart which will prepare internal services and start routes etc.
         try {
+            firstStartDone = true;
             super.start();
         } catch (VetoCamelContextStartException e) {
             if (e.isRethrowException()) {
@@ -1605,16 +1612,18 @@ public class DefaultCamelContext extends
         // filter out already started routes
         Map<String, RouteService> filtered = new LinkedHashMap<String, RouteService>();
         for (Map.Entry<String, RouteService> entry : routeServices.entrySet()) {
-            boolean startable;
+            boolean startable = false;
 
             Consumer consumer = entry.getValue().getRoutes().iterator().next().getConsumer();
             if (consumer instanceof SuspendableService) {
                 // consumer could be suspended, which is not reflected in the RouteService status
                 startable = ((SuspendableService) consumer).isSuspended();
-            } else if (consumer instanceof StatefulService) {
+            }
+
+            if (!startable && consumer instanceof StatefulService) {
                 // consumer could be stopped, which is not reflected in the RouteService status
                 startable = ((StatefulService) consumer).getStatus().isStartable();
-            } else {
+            } else if (!startable) {
                 // no consumer so use state from route service
                 startable = entry.getValue().getStatus().isStartable();
             }

Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/impl/DefaultCamelContextAutoStartupTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/impl/DefaultCamelContextAutoStartupTest.java?rev=1231135&r1=1231134&r2=1231135&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/impl/DefaultCamelContextAutoStartupTest.java (original)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/impl/DefaultCamelContextAutoStartupTest.java Fri Jan 13 15:42:25 2012
@@ -25,7 +25,42 @@ import org.apache.camel.component.mock.M
  */
 public class DefaultCamelContextAutoStartupTest extends TestSupport {
 
-    public void testAutoStartupFalse() throws Exception {
+    // TODO: We should have a JMX test of this as well
+
+    public void testAutoStartupFalseContextStart() throws Exception {
+        DefaultCamelContext camel = new DefaultCamelContext(new SimpleRegistry());
+        camel.disableJMX();
+        camel.setAutoStartup(false);
+
+        camel.addRoutes(new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start").routeId("foo").to("mock:result");
+            }
+        });
+        camel.start();
+
+        assertEquals(true, camel.isStarted());
+        assertEquals(1, camel.getRoutes().size());
+        assertEquals(true, camel.getRouteStatus("foo").isStopped());
+
+        // now start camel again, to get it to start the routes
+        camel.start();
+
+        assertEquals(true, camel.getRouteStatus("foo").isStarted());
+
+        // and now its started we can test that it works by sending in a message to the route
+        MockEndpoint mock = camel.getEndpoint("mock:result", MockEndpoint.class);
+        mock.expectedMessageCount(1);
+
+        camel.createProducerTemplate().sendBody("direct:start", "Hello World");
+
+        mock.assertIsSatisfied();
+        
+        camel.stop();
+    }
+
+    public void testAutoStartupFalseRouteStart() throws Exception {
         DefaultCamelContext camel = new DefaultCamelContext(new SimpleRegistry());
         camel.disableJMX();
         camel.setAutoStartup(false);
@@ -54,7 +89,7 @@ public class DefaultCamelContextAutoStar
         camel.createProducerTemplate().sendBody("direct:start", "Hello World");
 
         mock.assertIsSatisfied();
-        
+
         camel.stop();
     }