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/06/30 11:59:56 UTC

svn commit: r959252 - in /camel/trunk/components: camel-jms/src/main/java/org/apache/camel/component/jms/ camel-jms/src/test/java/org/apache/camel/component/jms/tx/ camel-spring/src/main/java/org/apache/camel/spring/spi/

Author: davsclaus
Date: Wed Jun 30 09:59:56 2010
New Revision: 959252

URL: http://svn.apache.org/viewvc?rev=959252&view=rev
Log:
CAMEL-2881: Fixed markRollbackOnly to force rollback because Spring TM only works if you thrown runtime exceptions back to it.

Modified:
    camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/EndpointMessageListener.java
    camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/tx/JmsToJmsTransactedTest.java
    camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactionErrorHandler.java

Modified: camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/EndpointMessageListener.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/EndpointMessageListener.java?rev=959252&r1=959251&r2=959252&view=diff
==============================================================================
--- camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/EndpointMessageListener.java (original)
+++ camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/EndpointMessageListener.java Wed Jun 30 09:59:56 2010
@@ -25,6 +25,7 @@ import javax.jms.Session;
 import org.apache.camel.Exchange;
 import org.apache.camel.ExchangePattern;
 import org.apache.camel.Processor;
+import org.apache.camel.RollbackExchangeException;
 import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.impl.DefaultExchange;
 import org.apache.camel.impl.LoggingExceptionHandler;
@@ -90,7 +91,7 @@ public class EndpointMessageListener imp
             JmsMessage body = null;
             Exception cause = null;
             boolean sendReply = false;
-            if (exchange.isFailed()) {
+            if (exchange.isFailed() || exchange.isRollbackOnly()) {
                 if (exchange.getException() != null) {
                     // an exception occurred while processing
                     if (endpoint.isTransferException()) {
@@ -103,6 +104,9 @@ public class EndpointMessageListener imp
                         // do not send a reply but wrap and rethrow the exception
                         rce = wrapRuntimeCamelException(exchange.getException());
                     }
+                } else if (exchange.isRollbackOnly()) {
+                    // rollback only so wrap an exception so we can rethrow the exception to cause rollback
+                    rce = wrapRuntimeCamelException(new RollbackExchangeException(exchange));
                 } else if (exchange.getOut().getBody() != null) {
                     // a fault occurred while processing
                     body = (JmsMessage) exchange.getOut();

Modified: camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/tx/JmsToJmsTransactedTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/tx/JmsToJmsTransactedTest.java?rev=959252&r1=959251&r2=959252&view=diff
==============================================================================
--- camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/tx/JmsToJmsTransactedTest.java (original)
+++ camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/tx/JmsToJmsTransactedTest.java Wed Jun 30 09:59:56 2010
@@ -19,7 +19,6 @@ package org.apache.camel.component.jms.t
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
 import org.apache.camel.test.junit4.CamelSpringTestSupport;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.springframework.context.support.ClassPathXmlApplicationContext;
 
@@ -113,7 +112,6 @@ public class JmsToJmsTransactedTest exte
     }
 
     @Test
-    @Ignore("markRollbackOnly causes Spring TX to not let JMS redeliver!")
     public void testJmsToJmsTestRollbackDueToMarkRollbackOnly() throws Exception {
         context.addRoutes(new RouteBuilder() {
             @Override
@@ -132,7 +130,6 @@ public class JmsToJmsTransactedTest exte
         MockEndpoint bar = getMockEndpoint("mock:bar");
         bar.expectedMessageCount(0);
 
-        // TODO: mark rollback only causes Spring TX to not rollback on JMS queue
         MockEndpoint start = getMockEndpoint("mock:start");
         start.expectedMessageCount(6);
 

Modified: camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactionErrorHandler.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactionErrorHandler.java?rev=959252&r1=959251&r2=959252&view=diff
==============================================================================
--- camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactionErrorHandler.java (original)
+++ camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactionErrorHandler.java Wed Jun 30 09:59:56 2010
@@ -156,7 +156,7 @@ public class TransactionErrorHandler ext
             protected void doInTransactionWithoutResult(TransactionStatus status) {
                 // wrapper exception to throw if the exchange failed
                 // IMPORTANT: Must be a runtime exception to let Spring regard it as to do "rollback"
-                RuntimeCamelException rce = null;
+                RuntimeException rce = null;
 
                 exchange.setProperty(Exchange.TRANSACTED, Boolean.TRUE);
 
@@ -210,6 +210,9 @@ public class TransactionErrorHandler ext
                     // wrap exception in transacted exception
                     if (exchange.getException() != null) {
                         rce = ObjectHelper.wrapRuntimeCamelException(exchange.getException());
+                    } else if (exchange.isRollbackOnly()) {
+                        // create dummy exception to force spring transaction manager to rollback
+                        rce = new TransactionRollbackException();
                     }
 
                     if (!status.isRollbackOnly()) {
@@ -219,9 +222,6 @@ public class TransactionErrorHandler ext
                     // rethrow if an exception occurred
                     if (rce != null) {
                         throw rce;
-                    } else {
-                        // create dummy exception to force spring transaction manager to rollback
-                        throw new TransactionRollbackException();
                     }
                 }
             }