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/09/09 15:06:59 UTC

svn commit: r1382489 - in /camel/trunk: camel-core/src/main/java/org/apache/camel/builder/ camel-core/src/main/java/org/apache/camel/impl/ camel-core/src/main/java/org/apache/camel/model/ camel-core/src/main/java/org/apache/camel/processor/ camel-core/...

Author: davsclaus
Date: Sun Sep  9 13:06:58 2012
New Revision: 1382489

URL: http://svn.apache.org/viewvc?rev=1382489&view=rev
Log:
CAMEL-3364: Added option redeliverWhileStopping to control if redelivery is allowed during stopping a route. Turn this off to stop quicker by not allowing redeliveriers.

Added:
    camel/trunk/camel-core/src/test/java/org/apache/camel/processor/RedeliveryErrorHandlerNoRedeliveryOnShutdownTest.java   (with props)
    camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringRedeliveryErrorHandlerNoRedeliveryOnShutdownTest.java
      - copied, changed from r1382483, camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringAOPBeforeTest.java
    camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringRedeliveryErrorHandlerNoRedeliveryOnShutdownTest.xml
      - copied, changed from r1382483, camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/aopbefore.xml
Modified:
    camel/trunk/camel-core/src/main/java/org/apache/camel/builder/DefaultErrorHandlerBuilder.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultShutdownStrategy.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/model/RedeliveryPolicyDefinition.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RedeliveryErrorHandler.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RedeliveryPolicy.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/util/ServiceHelper.java
    camel/trunk/components/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelRedeliveryPolicyFactoryBean.java

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/builder/DefaultErrorHandlerBuilder.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/DefaultErrorHandlerBuilder.java?rev=1382489&r1=1382488&r2=1382489&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/builder/DefaultErrorHandlerBuilder.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/builder/DefaultErrorHandlerBuilder.java Sun Sep  9 13:06:58 2012
@@ -167,6 +167,17 @@ public class DefaultErrorHandlerBuilder 
     }
 
     /**
+     * Controls whether to allow redelivery while stopping/shutting down a route that uses error handling.
+     *
+     * @param redeliverWhileStopping <tt>true</tt> to allow redelivery, <tt>false</tt> to reject redeliveries
+     * @return the builder
+     */
+    public DefaultErrorHandlerBuilder redeliverWhileStopping(boolean redeliverWhileStopping) {
+        getRedeliveryPolicy().setRedeliverWhileStopping(redeliverWhileStopping);
+        return this;
+    }
+
+    /**
      * Sets a reference to a thread pool to be used for redelivery.
      *
      * @param ref reference to a scheduled thread pool

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=1382489&r1=1382488&r2=1382489&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 Sep  9 13:06:58 2012
@@ -189,6 +189,7 @@ public class DefaultShutdownStrategy ext
             } else {
                 if (forceShutdown || shutdownNowOnTimeout) {
                     LOG.warn("Timeout occurred. Now forcing the routes to be shutdown now.");
+                    forceShutdown = true;
                     // force the routes to shutdown now
                     shutdownRoutesNow(routesOrdered);
 
@@ -373,7 +374,8 @@ public class DefaultShutdownStrategy ext
     private static void prepareShutdown(Service service, boolean forced, boolean includeChildren) {
         Set<Service> list;
         if (includeChildren) {
-            list = ServiceHelper.getChildServices(service);
+            // include error handlers as we want to prepare them for shutdown as well
+            list = ServiceHelper.getChildServices(service, true);
         } else {
             list = new LinkedHashSet<Service>(1);
             list.add(service);
@@ -499,6 +501,17 @@ public class DefaultShutdownStrategy ext
                 }
             }
 
+            // notify the services we intend to shutdown
+            for (RouteStartupOrder order : routes) {
+                for (Service service : order.getServices()) {
+                    // skip the consumer as we handle that specially
+                    if (service instanceof Consumer) {
+                        continue;
+                    }
+                    prepareShutdown(service, false, true);
+                }
+            }
+
             // wait till there are no more pending and inflight messages
             boolean done = false;
             long loopDelaySeconds = 1;

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/model/RedeliveryPolicyDefinition.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/model/RedeliveryPolicyDefinition.java?rev=1382489&r1=1382488&r2=1382489&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/model/RedeliveryPolicyDefinition.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/model/RedeliveryPolicyDefinition.java Sun Sep  9 13:06:58 2012
@@ -71,6 +71,8 @@ public class RedeliveryPolicyDefinition 
     private String disableRedelivery;
     @XmlAttribute
     private String delayPattern;
+    @XmlAttribute
+    private String redeliverWhileStopping;
 
     public RedeliveryPolicy createRedeliveryPolicy(CamelContext context, RedeliveryPolicy parentPolicy) {
 
@@ -142,6 +144,9 @@ public class RedeliveryPolicyDefinition 
             if (delayPattern != null) {
                 answer.setDelayPattern(delayPattern);
             }
+            if (redeliverWhileStopping != null) {
+                answer.setLogExhausted(CamelContextHelper.parseBoolean(context, redeliverWhileStopping));
+            }
         } catch (Exception e) {
             throw ObjectHelper.wrapRuntimeCamelException(e);
         }
@@ -166,6 +171,21 @@ public class RedeliveryPolicyDefinition 
     }
 
     /**
+     * Allow synchronous delayed redelivery.
+     */
+    public RedeliveryPolicyDefinition redeliverWhileStopping(boolean redeliverWhileStopping) {
+        return redeliverWhileStopping(Boolean.toString(redeliverWhileStopping));
+    }
+
+    /**
+     * Allow synchronous delayed redelivery.
+     */
+    public RedeliveryPolicyDefinition redeliverWhileStopping(String redeliverWhileStopping) {
+        setRedeliverWhileStopping(redeliverWhileStopping);
+        return this;
+    }
+
+    /**
      * Sets the back off multiplier
      *
      * @param backOffMultiplier  the back off multiplier
@@ -640,4 +660,12 @@ public class RedeliveryPolicyDefinition 
     public void setDelayPattern(String delayPattern) {
         this.delayPattern = delayPattern;
     }
+
+    public String getRedeliverWhileStopping() {
+        return redeliverWhileStopping;
+    }
+
+    public void setRedeliverWhileStopping(String redeliverWhileStopping) {
+        this.redeliverWhileStopping = redeliverWhileStopping;
+    }
 }

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RedeliveryErrorHandler.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RedeliveryErrorHandler.java?rev=1382489&r1=1382488&r2=1382489&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RedeliveryErrorHandler.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RedeliveryErrorHandler.java Sun Sep  9 13:06:58 2012
@@ -30,6 +30,7 @@ import org.apache.camel.Message;
 import org.apache.camel.Predicate;
 import org.apache.camel.Processor;
 import org.apache.camel.model.OnExceptionDefinition;
+import org.apache.camel.spi.ShutdownPrepared;
 import org.apache.camel.spi.SubUnitOfWorkCallback;
 import org.apache.camel.spi.UnitOfWork;
 import org.apache.camel.util.AsyncProcessorConverterHelper;
@@ -51,7 +52,7 @@ import org.apache.camel.util.ServiceHelp
  *
  * @version
  */
-public abstract class RedeliveryErrorHandler extends ErrorHandlerSupport implements AsyncProcessor {
+public abstract class RedeliveryErrorHandler extends ErrorHandlerSupport implements AsyncProcessor, ShutdownPrepared {
 
     protected ScheduledExecutorService executorService;
     protected final CamelContext camelContext;
@@ -65,6 +66,7 @@ public abstract class RedeliveryErrorHan
     protected final CamelLogger logger;
     protected final boolean useOriginalMessagePolicy;
     protected boolean redeliveryEnabled;
+    protected volatile boolean preparingShutdown;
 
     /**
      * Contains the current redelivery data
@@ -86,6 +88,7 @@ public abstract class RedeliveryErrorHan
         Predicate continuedPredicate;
         boolean useOriginalInMessage = useOriginalMessagePolicy;
         boolean asyncDelayedRedelivery = redeliveryPolicy.isAsyncDelayedRedelivery();
+        boolean redeliverWhileStopping = redeliveryPolicy.isRedeliverWhileStopping();
     }
 
     /**
@@ -198,14 +201,38 @@ public abstract class RedeliveryErrorHan
         return false;
     }
 
-    @Override
-    public boolean isRunAllowed() {
-        // determine if we can still run, or the camel context is forcing a shutdown
+    protected boolean isRunAllowed(RedeliveryData data) {
+        // if camel context is forcing a shutdown then do not allow running
         boolean forceShutdown = camelContext.getShutdownStrategy().forceShutdown(this);
         if (forceShutdown) {
-            log.trace("Run not allowed as ShutdownStrategy is forcing shutting down");
+            log.trace("isRunAllowed() -> false (Run not allowed as ShutdownStrategy is forcing shutting down)");
+            return false;
+        }
+
+        // redelivery policy can control if redelivery is allowed during stopping/shutdown
+        // but this only applies during a redelivery (counter must > 0)
+        if (data.redeliveryCounter > 0) {
+            if (data.redeliverWhileStopping) {
+                log.trace("isRunAllowed() -> true (Run allowed as RedeliverWhileStopping is enabled)");
+                return true;
+            } else if (preparingShutdown) {
+                // do not allow redelivery as we are preparing for shutdown
+                log.trace("isRunAllowed() -> false (Run not allowed as we are preparing for shutdown)");
+                return false;
+            }
         }
-        return !forceShutdown && super.isRunAllowed();
+
+        // fallback and use code from super
+        boolean answer = super.isRunAllowed();
+        log.trace("isRunAllowed() -> {} (Run allowed if we are not stopped/stopping)", answer);
+        return answer;
+    }
+
+    @Override
+    public void prepareShutdown(boolean forced) {
+        // prepare for shutdown, eg do not allow redelivery if configured
+        log.trace("Prepare shutdown on error handler {}", this);
+        preparingShutdown = true;
     }
 
     public void process(Exchange exchange) throws Exception {
@@ -233,7 +260,7 @@ public abstract class RedeliveryErrorHan
         while (true) {
 
             // can we still run
-            if (!isRunAllowed()) {
+            if (!isRunAllowed(data)) {
                 log.trace("Run not allowed, will reject executing exchange: {}", exchange);
                 if (exchange.getException() == null) {
                     exchange.setException(new RejectedExecutionException());
@@ -404,7 +431,7 @@ public abstract class RedeliveryErrorHan
      */
     protected void processAsyncErrorHandler(final Exchange exchange, final AsyncCallback callback, final RedeliveryData data) {
         // can we still run
-        if (!isRunAllowed()) {
+        if (!isRunAllowed(data)) {
             log.trace("Run not allowed, will reject executing exchange: {}", exchange);
             if (exchange.getException() == null) {
                 exchange.setException(new RejectedExecutionException());
@@ -1071,6 +1098,9 @@ public abstract class RedeliveryErrorHan
                 log.trace("Using ExecutorService: {} for redeliveries on error handler: {}", executorService, this);
             }
         }
+
+        // reset flag when starting
+        preparingShutdown = false;
     }
 
     @Override

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RedeliveryPolicy.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RedeliveryPolicy.java?rev=1382489&r1=1382488&r2=1382489&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RedeliveryPolicy.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RedeliveryPolicy.java Sun Sep  9 13:06:58 2012
@@ -96,6 +96,7 @@ public class RedeliveryPolicy implements
     protected boolean logRetryAttempted = true;
     protected String delayPattern;
     protected boolean asyncDelayedRedelivery;
+    protected boolean redeliverWhileStopping = true;
 
     public RedeliveryPolicy() {
     }
@@ -106,6 +107,7 @@ public class RedeliveryPolicy implements
             + ", redeliveryDelay=" + redeliveryDelay
             + ", maximumRedeliveryDelay=" + maximumRedeliveryDelay
             + ", asyncDelayedRedelivery=" + asyncDelayedRedelivery
+            + ", redeliverWhileStopping=" + redeliverWhileStopping
             + ", retriesExhaustedLogLevel=" + retriesExhaustedLogLevel
             + ", retryAttemptedLogLevel=" + retryAttemptedLogLevel
             + ", logRetryAttempted=" + logRetryAttempted
@@ -403,6 +405,16 @@ public class RedeliveryPolicy implements
         return this;
     }
 
+    /**
+     * Controls whether to allow redelivery while stopping/shutting down a route that uses error handling.
+     *
+     * @param redeliverWhileStopping <tt>true</tt> to allow redelivery, <tt>false</tt> to reject redeliveries
+     */
+    public RedeliveryPolicy redeliverWhileStopping(boolean redeliverWhileStopping) {
+        setRedeliverWhileStopping(redeliverWhileStopping);
+        return this;
+    }
+
     // Properties
     // -------------------------------------------------------------------------
 
@@ -647,4 +659,18 @@ public class RedeliveryPolicy implements
     public void setAsyncDelayedRedelivery(boolean asyncDelayedRedelivery) {
         this.asyncDelayedRedelivery = asyncDelayedRedelivery;
     }
+
+    public boolean isRedeliverWhileStopping() {
+        return redeliverWhileStopping;
+    }
+
+    /**
+     * Controls whether to allow redelivery while stopping/shutting down a route that uses error handling.
+     *
+     * @param redeliverWhileStopping <tt>true</tt> to allow redelivery, <tt>false</tt> to reject redeliveries
+     */
+    public void setRedeliverWhileStopping(boolean redeliverWhileStopping) {
+        this.redeliverWhileStopping = redeliverWhileStopping;
+    }
+
 }

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/util/ServiceHelper.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/util/ServiceHelper.java?rev=1382489&r1=1382488&r2=1382489&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/util/ServiceHelper.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/util/ServiceHelper.java Sun Sep  9 13:06:58 2012
@@ -22,11 +22,14 @@ import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Set;
 
+import org.apache.camel.Channel;
 import org.apache.camel.Navigate;
+import org.apache.camel.Processor;
 import org.apache.camel.Service;
 import org.apache.camel.ShutdownableService;
 import org.apache.camel.StatefulService;
 import org.apache.camel.SuspendableService;
+import org.apache.camel.processor.ErrorHandler;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -366,20 +369,38 @@ public final class ServiceHelper {
      * @return the services, including the parent service, and all its children
      */
     public static Set<Service> getChildServices(Service service) {
+        return getChildServices(service, false);
+    }
+
+    /**
+     * Gather all child services by navigating the service to recursively gather all child services.
+     *
+     * @param service the service
+     * @param includeErrorHandler whether to include error handlers
+     * @return the services, including the parent service, and all its children
+     */
+    public static Set<Service> getChildServices(Service service, boolean includeErrorHandler) {
         Set<Service> answer = new LinkedHashSet<Service>();
-        doGetChildServices(answer, service);
+        doGetChildServices(answer, service, includeErrorHandler);
         return answer;
     }
 
-    private static void doGetChildServices(Set<Service> services, Service service) {
+    private static void doGetChildServices(Set<Service> services, Service service, boolean includeErrorHandler) {
         services.add(service);
         if (service instanceof Navigate) {
             Navigate<?> nav = (Navigate<?>) service;
             if (nav.hasNext()) {
                 List<?> children = nav.next();
                 for (Object child : children) {
+                    // special for error handler as they are tied to the Channel
+                    if (child instanceof Channel && includeErrorHandler) {
+                        Processor errorHandler = ((Channel) child).getErrorHandler();
+                        if (errorHandler != null && errorHandler instanceof Service) {
+                            services.add((Service) errorHandler);
+                        }
+                    }
                     if (child instanceof Service) {
-                        doGetChildServices(services, (Service) child);
+                        doGetChildServices(services, (Service) child, includeErrorHandler);
                     }
                 }
             }

Added: camel/trunk/camel-core/src/test/java/org/apache/camel/processor/RedeliveryErrorHandlerNoRedeliveryOnShutdownTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/RedeliveryErrorHandlerNoRedeliveryOnShutdownTest.java?rev=1382489&view=auto
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/processor/RedeliveryErrorHandlerNoRedeliveryOnShutdownTest.java (added)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/processor/RedeliveryErrorHandlerNoRedeliveryOnShutdownTest.java Sun Sep  9 13:06:58 2012
@@ -0,0 +1,64 @@
+/**
+ * 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 org.apache.camel.ContextTestSupport;
+import org.apache.camel.LoggingLevel;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.util.StopWatch;
+
+/**
+ *
+ */
+public class RedeliveryErrorHandlerNoRedeliveryOnShutdownTest extends ContextTestSupport {
+
+    public void testRedeliveryErrorHandlerNoRedeliveryOnShutdown() throws Exception {
+        getMockEndpoint("mock:foo").expectedMessageCount(1);
+
+        template.sendBody("seda:foo", "Hello World");
+
+        assertMockEndpointsSatisfied();
+
+        // should not take long to stop the route
+        StopWatch watch = new StopWatch();
+        context.stopRoute("foo");
+        watch.stop();
+
+        assertTrue("Should stop route faster, was " + watch.taken(), watch.taken() < 4000);
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                // START SNIPPET: e1
+
+                // this error handler will try up till 20 redelivery attempts with 1 second between.
+                // however if we are stopping then do not allow any redeliver attempts.
+                errorHandler(defaultErrorHandler()
+                        .redeliverWhileStopping(false)
+                        .maximumRedeliveries(20).redeliveryDelay(1000).retryAttemptedLogLevel(LoggingLevel.INFO));
+
+                from("seda:foo").routeId("foo")
+                    .to("mock:foo")
+                    .throwException(new IllegalArgumentException("Forced"));
+                // END SNIPPET: e1
+            }
+        };
+    }
+}

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

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

Modified: camel/trunk/components/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelRedeliveryPolicyFactoryBean.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelRedeliveryPolicyFactoryBean.java?rev=1382489&r1=1382488&r2=1382489&view=diff
==============================================================================
--- camel/trunk/components/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelRedeliveryPolicyFactoryBean.java (original)
+++ camel/trunk/components/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelRedeliveryPolicyFactoryBean.java Sun Sep  9 13:06:58 2012
@@ -69,6 +69,8 @@ public abstract class AbstractCamelRedel
     private String disableRedelivery;
     @XmlAttribute
     private String delayPattern;
+    @XmlAttribute
+    private String redeliverWhileStopping;
 
     public RedeliveryPolicy getObject() throws Exception {
         RedeliveryPolicy answer = new RedeliveryPolicy();
@@ -133,6 +135,9 @@ public abstract class AbstractCamelRedel
         if (delayPattern != null) {
             answer.setDelayPattern(CamelContextHelper.parseText(context, delayPattern));
         }
+        if (redeliverWhileStopping != null) {
+            answer.setRedeliverWhileStopping(CamelContextHelper.parseBoolean(context, redeliverWhileStopping));
+        }
 
         return answer;
     }
@@ -284,4 +289,12 @@ public abstract class AbstractCamelRedel
     public void setDelayPattern(String delayPattern) {
         this.delayPattern = delayPattern;
     }
+
+    public String getRedeliverWhileStopping() {
+        return redeliverWhileStopping;
+    }
+
+    public void setRedeliverWhileStopping(String redeliverWhileStopping) {
+        this.redeliverWhileStopping = redeliverWhileStopping;
+    }
 }
\ No newline at end of file

Copied: camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringRedeliveryErrorHandlerNoRedeliveryOnShutdownTest.java (from r1382483, camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringAOPBeforeTest.java)
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringRedeliveryErrorHandlerNoRedeliveryOnShutdownTest.java?p2=camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringRedeliveryErrorHandlerNoRedeliveryOnShutdownTest.java&p1=camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringAOPBeforeTest.java&r1=1382483&r2=1382489&rev=1382489&view=diff
==============================================================================
--- camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringAOPBeforeTest.java (original)
+++ camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringRedeliveryErrorHandlerNoRedeliveryOnShutdownTest.java Sun Sep  9 13:06:58 2012
@@ -17,15 +17,16 @@
 package org.apache.camel.spring.processor;
 
 import org.apache.camel.CamelContext;
-import org.apache.camel.processor.AOPBeforeTest;
+import org.apache.camel.processor.RedeliveryErrorHandlerNoRedeliveryOnShutdownTest;
+
 import static org.apache.camel.spring.processor.SpringTestHelper.createSpringCamelContext;
 
 /**
  * @version 
  */
-public class SpringAOPBeforeTest extends AOPBeforeTest {
+public class SpringRedeliveryErrorHandlerNoRedeliveryOnShutdownTest extends RedeliveryErrorHandlerNoRedeliveryOnShutdownTest {
 
     protected CamelContext createCamelContext() throws Exception {
-        return createSpringCamelContext(this, "org/apache/camel/spring/processor/aopbefore.xml");
+        return createSpringCamelContext(this, "org/apache/camel/spring/processor/SpringRedeliveryErrorHandlerNoRedeliveryOnShutdownTest.xml");
     }
 }
\ No newline at end of file

Copied: camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringRedeliveryErrorHandlerNoRedeliveryOnShutdownTest.xml (from r1382483, camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/aopbefore.xml)
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringRedeliveryErrorHandlerNoRedeliveryOnShutdownTest.xml?p2=camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringRedeliveryErrorHandlerNoRedeliveryOnShutdownTest.xml&p1=camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/aopbefore.xml&r1=1382483&r2=1382489&rev=1382489&view=diff
==============================================================================
--- camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/aopbefore.xml (original)
+++ camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringRedeliveryErrorHandlerNoRedeliveryOnShutdownTest.xml Sun Sep  9 13:06:58 2012
@@ -22,15 +22,27 @@
        http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
     ">
 
+	<!-- exception to be thrown to force redelivery -->
+	<bean id="forced" class="java.lang.IllegalArgumentException">
+		<constructor-arg index="0" value="Forced"/>
+	</bean>
+
     <!-- START SNIPPET: e1 -->
-    <camelContext xmlns="http://camel.apache.org/schema/spring">
-        <route>
-            <from uri="direct:start"/>
-            <aop beforeUri="mock:before">
-                <transform><constant>Bye World</constant></transform>
-                <to uri="mock:result"/>
-            </aop>
+	<!-- notice we use the errorHandlerRef attribute to refer to the error handler to use as default -->
+    <camelContext errorHandlerRef="myErrorHandler" xmlns="http://camel.apache.org/schema/spring">
+
+		<!-- configure error handler, to redeliver up till 10 times, with 1 sec delay
+		     and if we are stopping then do not allow redeliveries, to stop faster -->
+		<errorHandler id="myErrorHandler" type="DefaultErrorHandler">
+			<redeliveryPolicy maximumRedeliveries="20" redeliveryDelay="1000" redeliverWhileStopping="false" retryAttemptedLogLevel="INFO"/>
+		</errorHandler>
+
+        <route id="foo">
+            <from uri="seda:foo"/>
+			<to uri="mock:foo"/>
+			<throwException ref="forced"/>
         </route>
+
     </camelContext>
     <!-- END SNIPPET: e1 -->