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 2010/03/28 10:14:34 UTC

svn commit: r928357 - in /camel/trunk/camel-core/src: main/java/org/apache/camel/impl/ main/java/org/apache/camel/spi/ test/java/org/apache/camel/processor/

Author: davsclaus
Date: Sun Mar 28 08:14:34 2010
New Revision: 928357

URL: http://svn.apache.org/viewvc?rev=928357&view=rev
Log:
CAMEL-2587: Routes is now shutdown in reverse order as they were started.

Added:
    camel/trunk/camel-core/src/test/java/org/apache/camel/processor/RouteShutdownNotReverseOrderTest.java   (with props)
    camel/trunk/camel-core/src/test/java/org/apache/camel/processor/RouteShutdownReverseOrderTest.java
      - copied, changed from r928220, camel/trunk/camel-core/src/test/java/org/apache/camel/processor/RouteStartupOrderDirectTest.java
Modified:
    camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultShutdownStrategy.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/spi/ShutdownStrategy.java

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultShutdownStrategy.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultShutdownStrategy.java?rev=928357&r1=928356&r2=928357&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultShutdownStrategy.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultShutdownStrategy.java Sun Mar 28 08:14:34 2010
@@ -17,6 +17,7 @@
 package org.apache.camel.impl;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
@@ -54,6 +55,9 @@ import org.apache.commons.logging.LogFac
  * This ensures that when shutting down Camel it at some point eventually will shutdown.
  * This behavior can of course be configured using the {@link #setTimeout(long)} and
  * {@link #setShutdownNowOnTimeout(boolean)} methods.
+ * <p/>
+ * Routes will by default be shutdown in the reverse order of which they where started.
+ * You can customize this using the {@link #setShutdownRoutesInReverseOrder(boolean)} method.
  *
  * @version $Revision$
  */
@@ -65,6 +69,7 @@ public class DefaultShutdownStrategy ext
     private long timeout = 5 * 60;
     private TimeUnit timeUnit = TimeUnit.SECONDS;
     private boolean shutdownNowOnTimeout = true;
+    private boolean shutdownRoutesInReverseOrder = true;
 
     public DefaultShutdownStrategy() {
     }
@@ -80,14 +85,20 @@ public class DefaultShutdownStrategy ext
     public void shutdown(CamelContext context, List<RouteStartupOrder> routes, long timeout, TimeUnit timeUnit) throws Exception {
         long start = System.currentTimeMillis();
 
+        // should the order of routes be reversed?
+        List<RouteStartupOrder> routesOrdered = new ArrayList<RouteStartupOrder>(routes);
+        if (shutdownRoutesInReverseOrder) {
+            Collections.reverse(routesOrdered);
+        }
+
         if (timeout > 0) {
-            LOG.info("Starting to graceful shutdown " + routes.size() + " routes (timeout " + timeout + " " + timeUnit.toString().toLowerCase() + ")");
+            LOG.info("Starting to graceful shutdown " + routesOrdered.size() + " routes (timeout " + timeout + " " + timeUnit.toString().toLowerCase() + ")");
         } else {
-            LOG.info("Starting to graceful shutdown " + routes.size() + " routes (no timeout)");
+            LOG.info("Starting to graceful shutdown " + routesOrdered.size() + " routes (no timeout)");
         }
 
         // use another thread to perform the shutdowns so we can support timeout
-        Future future = getExecutorService().submit(new ShutdownTask(context, routes));
+        Future future = getExecutorService().submit(new ShutdownTask(context, routesOrdered));
         try {
             if (timeout > 0) {
                 future.get(timeout, timeUnit);
@@ -101,7 +112,7 @@ public class DefaultShutdownStrategy ext
             if (shutdownNowOnTimeout) {
                 LOG.warn("Timeout occurred. Now forcing the routes to be shutdown now.");
                 // force the routes to shutdown now
-                shutdownRoutesNow(routes);
+                shutdownRoutesNow(routesOrdered);
             } else {
                 LOG.warn("Timeout occurred. Will ignore shutting down the remainder routes.");
             }
@@ -114,7 +125,7 @@ public class DefaultShutdownStrategy ext
         // convert to seconds as its easier to read than a big milli seconds number
         long seconds = TimeUnit.SECONDS.convert(delta, TimeUnit.MILLISECONDS);
 
-        LOG.info("Graceful shutdown of " + routes.size() + " routes completed in " + seconds + " seconds");
+        LOG.info("Graceful shutdown of " + routesOrdered.size() + " routes completed in " + seconds + " seconds");
     }
 
     public void setTimeout(long timeout) {
@@ -141,6 +152,14 @@ public class DefaultShutdownStrategy ext
         return shutdownNowOnTimeout;
     }
 
+    public boolean isShutdownRoutesInReverseOrder() {
+        return shutdownRoutesInReverseOrder;
+    }
+
+    public void setShutdownRoutesInReverseOrder(boolean shutdownRoutesInReverseOrder) {
+        this.shutdownRoutesInReverseOrder = shutdownRoutesInReverseOrder;
+    }
+
     public CamelContext getCamelContext() {
         return camelContext;
     }
@@ -340,10 +359,12 @@ public class DefaultShutdownStrategy ext
                         suspendNow((SuspendableService) consumer, consumer);
                         // add it to the deferred list so the route will be shutdown later
                         deferredConsumers.add(new ShutdownDeferredConsumer(order.getRoute(), consumer));
-                        LOG.info("Route: " + order.getRoute().getId() + " suspended and shutdown deferred.");
+                        LOG.info("Route: " + order.getRoute().getId() + " suspended and shutdown deferred, was consuming from: "
+                                + order.getRoute().getEndpoint());
                     } else if (shutdown) {
                         shutdownNow(consumer);
-                        LOG.info("Route: " + order.getRoute().getId() + " shutdown complete.");
+                        LOG.info("Route: " + order.getRoute().getId() + " shutdown complete, was consuming from: "
+                                + order.getRoute().getEndpoint());
                     } else {
                         // we will stop it later, but for now it must run to be able to help all inflight messages
                         // be safely completed

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/spi/ShutdownStrategy.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/spi/ShutdownStrategy.java?rev=928357&r1=928356&r2=928357&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/spi/ShutdownStrategy.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/spi/ShutdownStrategy.java Sun Mar 28 08:14:34 2010
@@ -105,9 +105,26 @@ public interface ShutdownStrategy extend
     void setShutdownNowOnTimeout(boolean shutdownNowOnTimeout);
 
     /**
-     * whether to force shutdown of all consumers when a timeout occurred.
+     * Whether to force shutdown of all consumers when a timeout occurred.
      *
      * @return force shutdown or not
      */
     boolean isShutdownNowOnTimeout();
+
+    /**
+     * Sets whether routes should be shutdown in reverse or the same order as they where started.
+     *
+     * @param shutdownRoutesInReverseOrder <tt>true</tt> to shutdown in reverse order
+     */
+    void setShutdownRoutesInReverseOrder(boolean shutdownRoutesInReverseOrder);
+
+    /**
+     * Whether to shutdown routes in reverse order than they where started.
+     * <p/>
+     * This option is by default set to <tt>true</tt>.
+     *
+     * @return <tt>true</tt> if routes should be shutdown in reverse order.
+     */
+    boolean isShutdownRoutesInReverseOrder();
+
 }

Added: camel/trunk/camel-core/src/test/java/org/apache/camel/processor/RouteShutdownNotReverseOrderTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/RouteShutdownNotReverseOrderTest.java?rev=928357&view=auto
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/processor/RouteShutdownNotReverseOrderTest.java (added)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/processor/RouteShutdownNotReverseOrderTest.java Sun Mar 28 08:14:34 2010
@@ -0,0 +1,66 @@
+/**
+ * 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.util.List;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.camel.spi.RouteStartupOrder;
+
+/**
+ * @version $Revision$
+ */
+public class RouteShutdownNotReverseOrderTest extends ContextTestSupport {
+
+    public void testRouteShutdownNotReverseOrder() throws Exception {
+        // flip to not reverse
+        context.getShutdownStrategy().setShutdownRoutesInReverseOrder(false);
+
+        MockEndpoint mock = getMockEndpoint("mock:result");
+        mock.expectedMessageCount(1);
+
+        template.sendBody("direct:bar", "Hello World");
+
+        assertMockEndpointsSatisfied();
+
+        // assert correct startup order
+        DefaultCamelContext dcc = (DefaultCamelContext) context;
+        List<RouteStartupOrder> order = dcc.getRouteStartupOrder();
+
+        assertEquals(2, order.size());
+        assertEquals("direct://bar", order.get(0).getRoute().getEndpoint().getEndpointUri());
+        assertEquals("direct://foo", order.get(1).getRoute().getEndpoint().getEndpointUri());
+
+        // assert correct shutdown order
+        context.stop();
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:foo").startupOrder(2).routeId("foo").to("mock:result");
+
+                from("direct:bar").startupOrder(1).routeId("bar").to("direct:foo");
+            }
+        };
+    }
+}
\ No newline at end of file

Propchange: camel/trunk/camel-core/src/test/java/org/apache/camel/processor/RouteShutdownNotReverseOrderTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: camel/trunk/camel-core/src/test/java/org/apache/camel/processor/RouteShutdownNotReverseOrderTest.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Copied: camel/trunk/camel-core/src/test/java/org/apache/camel/processor/RouteShutdownReverseOrderTest.java (from r928220, camel/trunk/camel-core/src/test/java/org/apache/camel/processor/RouteStartupOrderDirectTest.java)
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/RouteShutdownReverseOrderTest.java?p2=camel/trunk/camel-core/src/test/java/org/apache/camel/processor/RouteShutdownReverseOrderTest.java&p1=camel/trunk/camel-core/src/test/java/org/apache/camel/processor/RouteStartupOrderDirectTest.java&r1=928220&r2=928357&rev=928357&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/processor/RouteStartupOrderDirectTest.java (original)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/processor/RouteShutdownReverseOrderTest.java Sun Mar 28 08:14:34 2010
@@ -27,9 +27,9 @@ import org.apache.camel.spi.RouteStartup
 /**
  * @version $Revision$
  */
-public class RouteStartupOrderDirectTest extends ContextTestSupport {
+public class RouteShutdownReverseOrderTest extends ContextTestSupport {
 
-    public void testRouteStartupOrder() throws Exception {
+    public void testRouteShutdownReverseOrder() throws Exception {
         MockEndpoint mock = getMockEndpoint("mock:result");
         mock.expectedMessageCount(1);
 
@@ -37,13 +37,16 @@ public class RouteStartupOrderDirectTest
 
         assertMockEndpointsSatisfied();
 
-        // assert correct order
+        // assert correct startup order
         DefaultCamelContext dcc = (DefaultCamelContext) context;
         List<RouteStartupOrder> order = dcc.getRouteStartupOrder();
 
         assertEquals(2, order.size());
         assertEquals("direct://bar", order.get(0).getRoute().getEndpoint().getEndpointUri());
         assertEquals("direct://foo", order.get(1).getRoute().getEndpoint().getEndpointUri());
+
+        // assert correct shutdown order
+        context.stop();
     }
 
     @Override