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();
}
}
}