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