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 2008/09/10 21:26:40 UTC

svn commit: r693940 - in /activemq/camel/trunk: camel-core/src/main/java/org/apache/camel/processor/ components/camel-jms/src/test/java/org/apache/camel/component/jms/ components/camel-jms/src/test/java/org/apache/camel/component/jms/issues/ components...

Author: davsclaus
Date: Wed Sep 10 12:26:36 2008
New Revision: 693940

URL: http://svn.apache.org/viewvc?rev=693940&view=rev
Log:
CAMEL-706: TransactedErrorHandler only supports delay. @deprecated options not supported.

Added:
    activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/DelayPolicy.java   (with props)
    activemq/camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/issues/TransactionErrorHandlerRedeliveryDelayTest.java   (with props)
    activemq/camel/trunk/components/camel-jms/src/test/resources/org/apache/camel/component/jms/issues/TransactionErrorHandlerRedeliveryDelayTest-context.xml   (contents, props changed)
      - copied, changed from r693358, activemq/camel/trunk/components/camel-jms/src/test/resources/org/apache/camel/component/jms/issues/JmsRedeliveryWithInitialRedeliveryDelayTest-context.xml
Modified:
    activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RedeliveryPolicy.java
    activemq/camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsTransactedRouteTest.java
    activemq/camel/trunk/components/camel-jms/src/test/resources/log4j.properties
    activemq/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactionErrorHandlerBuilder.java
    activemq/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactionInterceptor.java

Added: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/DelayPolicy.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/DelayPolicy.java?rev=693940&view=auto
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/DelayPolicy.java (added)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/DelayPolicy.java Wed Sep 10 12:26:36 2008
@@ -0,0 +1,81 @@
+/**
+ * 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.io.Serializable;
+
+/**
+ * The base policy used when a fixed delay is needed.
+ * <p/>
+ * This policy is used by
+ * <a href="http://activemq.apache.org/camel/transactional-client.html">Transactional client</a>
+ * and <a href="http://activemq.apache.org/camel/dead-letter-channel.html">Dead Letter Channel</a>.
+ *
+ * The default values is:
+ * <ul>
+ *   <li>delay = 1000L</li>
+ * </ul>
+ * <p/>
+ *
+ * @version $Revision$
+ */
+public class DelayPolicy implements Cloneable, Serializable {
+
+    protected long delay = 1000L;
+
+    public DelayPolicy() {
+    }
+
+    @Override
+    public String toString() {
+        return "DelayPolicy[delay=" + delay + "]";
+    }
+
+    public DelayPolicy copy() {
+        try {
+            return (DelayPolicy)clone();
+        } catch (CloneNotSupportedException e) {
+            throw new RuntimeException("Could not clone: " + e, e);
+        }
+    }
+
+    // Builder methods
+    // -------------------------------------------------------------------------
+
+    /**
+     * Sets the delay in milliseconds
+     */
+    public DelayPolicy delay(long delay) {
+        setDelay(delay);
+        return this;
+    }
+
+    // Properties
+    // -------------------------------------------------------------------------
+    public long getDelay() {
+        return delay;
+    }
+
+    /**
+     * Sets the delay in milliseconds
+     */
+    public void setDelay(long delay) {
+        this.delay = delay;
+    }
+
+
+}

Propchange: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/DelayPolicy.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/DelayPolicy.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RedeliveryPolicy.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RedeliveryPolicy.java?rev=693940&r1=693939&r2=693940&view=diff
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RedeliveryPolicy.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RedeliveryPolicy.java Wed Sep 10 12:26:36 2008
@@ -33,7 +33,7 @@
  * The default values is:
  * <ul>
  *   <li>maximumRedeliveries = 5</li>
- *   <li>initialRedeliveryDelay = 1000L</li>
+ *   <li>delay = 1000L (the initial delay)</li>
  *   <li>maximumRedeliveryDelay = 60 * 1000L</li>
  *   <li>backOffMultiplier = 2</li>
  *   <li>useExponentialBackOff = false</li>
@@ -46,12 +46,11 @@
  *
  * @version $Revision$
  */
-public class RedeliveryPolicy implements Cloneable, Serializable {
+public class RedeliveryPolicy extends DelayPolicy {
     protected static transient Random randomNumberGenerator;
     private static final transient Log LOG = LogFactory.getLog(RedeliveryPolicy.class);
 
     protected int maximumRedeliveries = 5;
-    protected long initialRedeliveryDelay = 1000L;
     protected long maximumRedeliveryDelay = 60 * 1000L;
     protected double backOffMultiplier = 2;
     protected boolean useExponentialBackOff;
@@ -64,7 +63,13 @@
 
     @Override
     public String toString() {
-        return "RedeliveryPolicy[maximumRedeliveries=" + maximumRedeliveries + "]";
+        return "RedeliveryPolicy[maximumRedeliveries=" + maximumRedeliveries +
+                ", initialRedeliveryDelay=" + delay +
+                ", maximumRedeliveryDelay=" + maximumRedeliveryDelay +
+                ", useExponentialBackOff=" + useExponentialBackOff +
+                ", backOffMultiplier=" + backOffMultiplier +
+                ", useCollisionAvoidance=" + useCollisionAvoidance +
+                ", collisionAvoidanceFactor=" + collisionAvoidanceFactor + "]";
     }
 
     public RedeliveryPolicy copy() {
@@ -114,7 +119,7 @@
         long redeliveryDelay;
 
         if (previousDelay == 0) {
-            redeliveryDelay = initialRedeliveryDelay;
+            redeliveryDelay = delay;
         } else if (useExponentialBackOff && backOffMultiplier > 1) {
             redeliveryDelay = Math.round(backOffMultiplier * previousDelay);
         } else {
@@ -154,9 +159,11 @@
 
     /**
      * Sets the initial redelivery delay in milliseconds on the first redelivery
+     *
+     * @deprecated use delay. Will be removed in Camel 2.0.
      */
     public RedeliveryPolicy initialRedeliveryDelay(long initialRedeliveryDelay) {
-        setInitialRedeliveryDelay(initialRedeliveryDelay);
+        setDelay(initialRedeliveryDelay);
         return this;
     }
 
@@ -244,15 +251,20 @@
         this.collisionAvoidanceFactor = collisionAvoidanceFactor;
     }
 
+    /**
+     * @deprecated  use delay instead. Will be removed in Camel 2.0.
+     */
     public long getInitialRedeliveryDelay() {
-        return initialRedeliveryDelay;
+        return getDelay();
     }
 
     /**
      * Sets the initial redelivery delay in milliseconds on the first redelivery
+     *
+     * @deprecated use delay instead. Will be removed in Camel 2.0.
      */
     public void setInitialRedeliveryDelay(long initialRedeliveryDelay) {
-        this.initialRedeliveryDelay = initialRedeliveryDelay;
+        setDelay(initialRedeliveryDelay);
     }
 
     public int getMaximumRedeliveries() {

Modified: activemq/camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsTransactedRouteTest.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsTransactedRouteTest.java?rev=693940&r1=693939&r2=693940&view=diff
==============================================================================
--- activemq/camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsTransactedRouteTest.java (original)
+++ activemq/camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsTransactedRouteTest.java Wed Sep 10 12:26:36 2008
@@ -30,12 +30,12 @@
  * @version $Revision$
  */
 public class JmsTransactedRouteTest extends ContextTestSupport {
+
     public void testJmsRouteWithTextMessage() throws Exception {
         MockEndpoint resultEndpoint = getMockEndpoint("mock:result");
         String expectedBody = "Hello there!";
         String expectedBody2 = "Goodbye!";
 
-
         resultEndpoint.expectedBodiesReceived(expectedBody, expectedBody2);
         resultEndpoint.message(0).header("cheese").isEqualTo(123);
 
@@ -50,8 +50,6 @@
 
         ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("vm://localhost?broker.persistent=false&broker.useJmx=false");
         JmsComponent component = jmsComponentTransacted(connectionFactory);
-        //component.getConfiguration().setCacheLevelName("CACHE_CONNECTION");
-        //component.getConfiguration().setCacheLevel(DefaultMessageListenerContainer.CACHE_CONNECTION);
         camelContext.addComponent("activemq", component);
         return camelContext;
     }

Added: activemq/camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/issues/TransactionErrorHandlerRedeliveryDelayTest.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/issues/TransactionErrorHandlerRedeliveryDelayTest.java?rev=693940&view=auto
==============================================================================
--- activemq/camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/issues/TransactionErrorHandlerRedeliveryDelayTest.java (added)
+++ activemq/camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/issues/TransactionErrorHandlerRedeliveryDelayTest.java Wed Sep 10 12:26:36 2008
@@ -0,0 +1,67 @@
+/**
+ * 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.component.jms.issues;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.EndpointInject;
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit38.AbstractJUnit38SpringContextTests;
+
+/**
+ * Unit test for issue CAMEL-706
+ */
+@ContextConfiguration
+public class TransactionErrorHandlerRedeliveryDelayTest extends AbstractJUnit38SpringContextTests {
+
+    private static int counter;
+
+    @Autowired
+    protected CamelContext context;
+
+    @EndpointInject(uri = "mock:result")
+    protected MockEndpoint result;
+
+    public void testTransactedRedeliveryDelay() throws Exception {
+        result.expectedMessageCount(1);
+        result.expectedBodiesReceived("Bye World");
+
+        long start = System.currentTimeMillis();
+        context.createProducerTemplate().sendBody("activemq:queue:in", "Hello World");
+
+        result.assertIsSatisfied();
+        long delta = System.currentTimeMillis() - start;
+        assertTrue("There should have been redelivery delay: delta=" + delta, delta > 6000L);
+    }
+
+    public static class MyFailureProcessor implements Processor {
+
+        public MyFailureProcessor() {
+        }
+
+        public void process(Exchange exchange) throws Exception {
+            if (counter++ < 3) {
+                throw new IllegalArgumentException("Forced exception as counter is " + counter);
+            }
+            assertTrue("Should be transacted", exchange.isTransacted());
+            exchange.getIn().setBody("Bye World");
+        }
+    }
+}

Propchange: activemq/camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/issues/TransactionErrorHandlerRedeliveryDelayTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: activemq/camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/issues/TransactionErrorHandlerRedeliveryDelayTest.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: activemq/camel/trunk/components/camel-jms/src/test/resources/log4j.properties
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-jms/src/test/resources/log4j.properties?rev=693940&r1=693939&r2=693940&view=diff
==============================================================================
--- activemq/camel/trunk/components/camel-jms/src/test/resources/log4j.properties (original)
+++ activemq/camel/trunk/components/camel-jms/src/test/resources/log4j.properties Wed Sep 10 12:26:36 2008
@@ -33,4 +33,5 @@
 log4j.appender.out.append=true
 
 #log4j.logger.org.apache.activemq.spring=WARN
-#log4j.logger.org.apache.camel.component.jms=DEBUG
\ No newline at end of file
+#log4j.logger.org.apache.camel.component.jms=DEBUG
+#log4j.logger.org.apache.camel=DEBUG
\ No newline at end of file

Copied: activemq/camel/trunk/components/camel-jms/src/test/resources/org/apache/camel/component/jms/issues/TransactionErrorHandlerRedeliveryDelayTest-context.xml (from r693358, activemq/camel/trunk/components/camel-jms/src/test/resources/org/apache/camel/component/jms/issues/JmsRedeliveryWithInitialRedeliveryDelayTest-context.xml)
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-jms/src/test/resources/org/apache/camel/component/jms/issues/TransactionErrorHandlerRedeliveryDelayTest-context.xml?p2=activemq/camel/trunk/components/camel-jms/src/test/resources/org/apache/camel/component/jms/issues/TransactionErrorHandlerRedeliveryDelayTest-context.xml&p1=activemq/camel/trunk/components/camel-jms/src/test/resources/org/apache/camel/component/jms/issues/JmsRedeliveryWithInitialRedeliveryDelayTest-context.xml&r1=693358&r2=693940&rev=693940&view=diff
==============================================================================
--- activemq/camel/trunk/components/camel-jms/src/test/resources/org/apache/camel/component/jms/issues/JmsRedeliveryWithInitialRedeliveryDelayTest-context.xml (original)
+++ activemq/camel/trunk/components/camel-jms/src/test/resources/org/apache/camel/component/jms/issues/TransactionErrorHandlerRedeliveryDelayTest-context.xml Wed Sep 10 12:26:36 2008
@@ -22,33 +22,50 @@
          http://activemq.apache.org/camel/schema/spring http://activemq.apache.org/camel/schema/spring/camel-spring.xsd">
 
     <camelContext id="camel" xmlns="http://activemq.apache.org/camel/schema/spring">
-        <route errorHandlerRef="myDeadLetterErrorHandler">
-            <from uri="activemq:in"/>
+        <route errorHandlerRef="myTransactionErrorHandler">
+            <from uri="activemq:queue:in"/>
+            <policy ref="required"/>
             <process ref="myFailureProcessor"/>
             <to uri="mock:result"/>
         </route>
     </camelContext>
 
-    <bean id="activemq" class="org.apache.camel.component.jms.JmsComponent">
-        <property name="connectionFactory">
-            <bean class="org.apache.activemq.ActiveMQConnectionFactory">
-                <property name="brokerURL" value="vm://localhost?broker.persistent=false"/>
-            </bean>
-        </property>
+    <bean id="myFailureProcessor" class="org.apache.camel.component.jms.issues.TransactionErrorHandlerRedeliveryDelayTest$MyFailureProcessor"/>
+
+    <bean id="myTransactionErrorHandler" class="org.apache.camel.spring.spi.TransactionErrorHandlerBuilder">
+        <property name="transactionTemplate" ref="PROPAGATION_REQUIRED"/>
+        <property name="delayPolicy" ref="myRedeliveryPolicyConfig"/>
+    </bean>
+
+    <bean id="myRedeliveryPolicyConfig" class="org.apache.camel.processor.DelayPolicy">
+        <property name="delay" value="2000"/>
+    </bean>
+
+    <bean id="required" class="org.apache.camel.spring.spi.SpringTransactionPolicy">
+        <property name="template" ref="PROPAGATION_REQUIRED"/>
     </bean>
 
-    <bean id="myDeadLetterErrorHandler" class="org.apache.camel.builder.DeadLetterChannelBuilder">
-        <property name="defaultDeadLetterEndpointUri" value="mock:dead"/>
-        <property name="redeliveryPolicy" ref="myRedeliveryPolicyConfig"/>
+    <bean id="PROPAGATION_REQUIRED" class="org.springframework.transaction.support.TransactionTemplate">
+        <property name="transactionManager" ref="jmsTransactionManager"/>
     </bean>
 
-    <bean id="myFailureProcessor" class="org.apache.camel.spring.config.MyFailureProcessor"/>
+    <bean id="jmsTransactionManager" class="org.springframework.jms.connection.JmsTransactionManager">
+        <property name="connectionFactory" ref="jmsConnectionFactory"/>
+    </bean>
+
+    <bean id="jmsConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
+        <property name="brokerURL" value="vm://localhost?broker.persistent=false&amp;broker.useJmx=false"/>
+    </bean>
 
-    <bean id="myRedeliveryPolicyConfig" class="org.apache.camel.processor.RedeliveryPolicy">
-        <property name="maximumRedeliveries" value="4"/>
-        <property name="initialRedeliveryDelay" value="500"/>
-        <property name="useExponentialBackOff" value="true"/>
-        <property name="backOffMultiplier" value="2"/>
+    <bean id="jmsConfig" class="org.apache.camel.component.jms.JmsConfiguration">
+        <property name="connectionFactory" ref="jmsConnectionFactory"/>
+        <property name="transactionManager" ref="jmsTransactionManager"/>
+        <property name="transacted" value="true"/>
+        <property name="concurrentConsumers" value="1"/>
+    </bean>
+
+    <bean id="activemq" class="org.apache.camel.component.jms.JmsComponent">
+        <property name="configuration" ref="jmsConfig"/>
     </bean>
 
 </beans>

Propchange: activemq/camel/trunk/components/camel-jms/src/test/resources/org/apache/camel/component/jms/issues/TransactionErrorHandlerRedeliveryDelayTest-context.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: activemq/camel/trunk/components/camel-jms/src/test/resources/org/apache/camel/component/jms/issues/TransactionErrorHandlerRedeliveryDelayTest-context.xml
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Propchange: activemq/camel/trunk/components/camel-jms/src/test/resources/org/apache/camel/component/jms/issues/TransactionErrorHandlerRedeliveryDelayTest-context.xml
------------------------------------------------------------------------------
    svn:mergeinfo = 

Propchange: activemq/camel/trunk/components/camel-jms/src/test/resources/org/apache/camel/component/jms/issues/TransactionErrorHandlerRedeliveryDelayTest-context.xml
------------------------------------------------------------------------------
    svn:mime-type = text/xml

Modified: activemq/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactionErrorHandlerBuilder.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactionErrorHandlerBuilder.java?rev=693940&r1=693939&r2=693940&view=diff
==============================================================================
--- activemq/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactionErrorHandlerBuilder.java (original)
+++ activemq/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactionErrorHandlerBuilder.java Wed Sep 10 12:26:36 2008
@@ -19,6 +19,7 @@
 import org.apache.camel.Processor;
 import org.apache.camel.builder.ErrorHandlerBuilder;
 import org.apache.camel.builder.ErrorHandlerBuilderSupport;
+import org.apache.camel.processor.DelayPolicy;
 import org.apache.camel.processor.RedeliveryPolicy;
 import org.apache.camel.spi.RouteContext;
 import org.apache.camel.util.ObjectHelper;
@@ -37,6 +38,7 @@
 
     private TransactionTemplate transactionTemplate;
     private RedeliveryPolicy redeliveryPolicy = new RedeliveryPolicy();
+    private DelayPolicy delayPolicy = new DelayPolicy();
 
     public TransactionErrorHandlerBuilder() {
     }
@@ -49,14 +51,28 @@
         this.transactionTemplate = transactionTemplate;
     }
 
+    /**
+     * @deprecated use setDelayPolicy. Will be removed in Camel 2.0
+     */
     public RedeliveryPolicy getRedeliveryPolicy() {
         return redeliveryPolicy;
     }
 
+    /**
+     * @deprecated use setDelayPolicy. Will be removed in Camel 2.0
+     */
     public void setRedeliveryPolicy(RedeliveryPolicy redeliveryPolicy) {
         this.redeliveryPolicy = redeliveryPolicy;
     }
 
+    public DelayPolicy getDelayPolicy() {
+        return delayPolicy;
+    }
+
+    public void setDelayPolicy(DelayPolicy delayPolicy) {
+        this.delayPolicy = delayPolicy;
+    }
+
     public ErrorHandlerBuilder copy() {
         try {
             return (ErrorHandlerBuilder) clone();
@@ -66,7 +82,7 @@
     }
 
     public Processor createErrorHandler(RouteContext routeContext, Processor processor) throws Exception {
-        return new TransactionInterceptor(processor, transactionTemplate, redeliveryPolicy);
+        return new TransactionInterceptor(processor, transactionTemplate, delayPolicy);
     }
 
     public void afterPropertiesSet() throws Exception {
@@ -75,39 +91,65 @@
 
     // Builder methods
     // -------------------------------------------------------------------------
+    /**
+     * @deprecated will be removed in Camel 2.0
+     */
     public TransactionErrorHandlerBuilder backOffMultiplier(double backOffMultiplier) {
         getRedeliveryPolicy().backOffMultiplier(backOffMultiplier);
         return this;
     }
 
+    /**
+     * @deprecated will be removed in Camel 2.0
+     */
     public TransactionErrorHandlerBuilder collisionAvoidancePercent(short collisionAvoidancePercent) {
         getRedeliveryPolicy().collisionAvoidancePercent(collisionAvoidancePercent);
         return this;
     }
 
+    /**
+     * @deprecated use delay - will be removed in Camel 2.0
+     */
     public TransactionErrorHandlerBuilder initialRedeliveryDelay(long initialRedeliveryDelay) {
-        getRedeliveryPolicy().initialRedeliveryDelay(initialRedeliveryDelay);
+        getDelayPolicy().delay(initialRedeliveryDelay);
         return this;
     }
 
+    /**
+     * @deprecated will be removed in Camel 2.0
+     */
     public TransactionErrorHandlerBuilder maximumRedeliveries(int maximumRedeliveries) {
         getRedeliveryPolicy().maximumRedeliveries(maximumRedeliveries);
         return this;
     }
 
+    /**
+     * @deprecated will be removed in Camel 2.0
+     */
     public TransactionErrorHandlerBuilder maximumRedeliveryDelay(long maximumRedeliveryDelay) {
         getRedeliveryPolicy().maximumRedeliveryDelay(maximumRedeliveryDelay);
         return this;
     }
 
+    /**
+     * @deprecated will be removed in Camel 2.0
+     */
     public TransactionErrorHandlerBuilder useCollisionAvoidance() {
         getRedeliveryPolicy().useCollisionAvoidance();
         return this;
     }
 
+    /**
+     * @deprecated will be removed in Camel 2.0
+     */
     public TransactionErrorHandlerBuilder useExponentialBackOff() {
         getRedeliveryPolicy().useExponentialBackOff();
         return this;
     }
 
+    public TransactionErrorHandlerBuilder delay(long delay) {
+        getDelayPolicy().delay(delay);
+        return this;
+    }
+
 }

Modified: activemq/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactionInterceptor.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactionInterceptor.java?rev=693940&r1=693939&r2=693940&view=diff
==============================================================================
--- activemq/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactionInterceptor.java (original)
+++ activemq/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactionInterceptor.java Wed Sep 10 12:26:36 2008
@@ -22,6 +22,7 @@
 import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.processor.DelegateProcessor;
 import org.apache.camel.processor.RedeliveryPolicy;
+import org.apache.camel.processor.DelayPolicy;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.springframework.transaction.TransactionDefinition;
@@ -42,13 +43,8 @@
         new ExchangeProperty<Boolean>("transacted", "org.apache.camel.transacted", Boolean.class);
     private static final transient Log LOG = LogFactory.getLog(TransactionInterceptor.class);
     private final TransactionTemplate transactionTemplate;
-    private ThreadLocal<RedeliveryData> previousRollback = new ThreadLocal<RedeliveryData>() {
-        @Override
-        protected RedeliveryData initialValue() {
-            return new RedeliveryData();
-        }
-    };
     private RedeliveryPolicy redeliveryPolicy;
+    private DelayPolicy delayPolicy;
 
     public TransactionInterceptor(TransactionTemplate transactionTemplate) {
         this.transactionTemplate = transactionTemplate;
@@ -59,9 +55,18 @@
         this.transactionTemplate = transactionTemplate;
     }
 
+    /**
+     * @deprecated use DelayPolicy. Will be removed in Camel 2.0
+     */
     public TransactionInterceptor(Processor processor, TransactionTemplate transactionTemplate, RedeliveryPolicy redeliveryPolicy) {
         this(processor, transactionTemplate);
         this.redeliveryPolicy = redeliveryPolicy;
+        this.delayPolicy = redeliveryPolicy;
+    }
+
+    public TransactionInterceptor(Processor processor, TransactionTemplate transactionTemplate, DelayPolicy delayPolicy) {
+        this(processor, transactionTemplate);
+        this.delayPolicy = delayPolicy;
     }
 
     @Override
@@ -72,17 +77,8 @@
     }
 
     public void process(final Exchange exchange) {
-        LOG.debug("Transaction begin");
-
-        final RedeliveryData redeliveryData = previousRollback.get();
-
         transactionTemplate.execute(new TransactionCallbackWithoutResult() {
             protected void doInTransactionWithoutResult(TransactionStatus status) {
-                // TODO: The delay is in some cases never triggered - see CAMEL-663
-                if (redeliveryPolicy != null && redeliveryData.previousRollback) {
-                    // lets delay
-                    redeliveryData.redeliveryDelay = redeliveryPolicy.sleep(redeliveryData.redeliveryDelay);
-                }
 
                 // wrapper exception to throw if the exchange failed
                 // IMPORTANT: Must be a runtime exception to let Spring regard it as to do "rollback"
@@ -96,18 +92,18 @@
                         activeTx = status.isNewTransaction() && !status.isCompleted();
                         if (!activeTx) {
                             if (DefaultTransactionStatus.class.isAssignableFrom(status.getClass())) {
-                                DefaultTransactionStatus defStatus = DefaultTransactionStatus.class
-                                    .cast(status);
+                                DefaultTransactionStatus defStatus =
+                                        DefaultTransactionStatus.class.cast(status);
                                 activeTx = defStatus.hasTransaction() && !status.isCompleted();
                             }
                         }
                     }
-                    if (LOG.isDebugEnabled()) {
-                        LOG.debug("Is actual transaction active: " + activeTx);
+                    if (LOG.isTraceEnabled()) {
+                        LOG.trace("Is actual transaction active: " + activeTx);
                     }
 
                     // okay mark the exchange as transacted, then the DeadLetterChannel or others know
-                    // its an transacted exchange
+                    // its a transacted exchange
                     if (activeTx) {
                         TRANSACTED.set(exchange, Boolean.TRUE);
                     }
@@ -124,36 +120,66 @@
                     rce = new RuntimeCamelException(e);
                 }
 
-                // rehrow exception if the exchange failed
+                // rethrow exception if the exchange failed
                 if (rce != null) {
-                    redeliveryData.previousRollback = true;
+                    // an exception occured so please sleep before we rethrow the exception
+                    delayBeforeRedelivery();
                     if (activeTx) {
                         status.setRollbackOnly();
-                        LOG.debug("Transaction rollback");
+                        LOG.debug("Setting transaction to rollbackOnly due to exception being thrown: " + rce.getMessage());
                     }
                     throw rce;
                 }
             }
         });
+    }
 
-        redeliveryData.previousRollback = false;
-        redeliveryData.redeliveryDelay = 0L;
+    /**
+     * Sleeps before the transaction is set as rollback and the caused exception is rethrown to let the
+     * Spring TransactionManager handle the rollback.
+     */
+    protected void delayBeforeRedelivery() {
+        long delay = 0;
+        if (redeliveryPolicy != null) {
+            delay = redeliveryPolicy.getDelay();
+        } else if (delayPolicy != null) {
+            delay = delayPolicy.getDelay();
+        }
 
-        LOG.debug("Transaction commit");
+        if (delay > 0) {
+            try {
+                if (LOG.isDebugEnabled()) {
+                    LOG.debug("Sleeping for: " + delay + " millis until attempting redelivery");
+                }
+                Thread.sleep(delay);
+            } catch (InterruptedException e) {
+                if (LOG.isDebugEnabled()) {
+                    LOG.debug("Thread interrupted: " + e, e);
+                }
+            }
+        }
     }
 
-
+    /**
+     * @deprecated use DelayPolicy. Will be removed in Camel 2.0
+     */
     public RedeliveryPolicy getRedeliveryPolicy() {
         return redeliveryPolicy;
     }
 
+    /**
+     * @deprecated use DelayPolicy. Will be removed in Camel 2.0
+     */
     public void setRedeliveryPolicy(RedeliveryPolicy redeliveryPolicy) {
         this.redeliveryPolicy = redeliveryPolicy;
     }
 
-    protected static class RedeliveryData {
-        boolean previousRollback;
-        long redeliveryDelay;
+    public DelayPolicy getDelayPolicy() {
+        return delayPolicy;
+    }
+
+    public void setDelayPolicy(DelayPolicy delayPolicy) {
+        this.delayPolicy = delayPolicy;
     }
 
     protected String propagationBehaviorToString(int propagationBehavior) {