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&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) {