Author: davsclaus
Date: Thu Dec 3 14:06:52 2009
New Revision: 886781
URL: http://svn.apache.org/viewvc?rev=886781&view=rev
Log:
CAMEL-2052, CAMEL-2054: Minor overhaul of TransactionErrorHandler simplyfing
internal logic. Added better support for using multiple transactions with
different propagation behavior. Added markRollbackOnlyLast() to rollback only
last TX and not the outer TXs.
Added:
camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactionRollbackException.java
(contents, props changed)
- copied, changed from r886727,
camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactedRuntimeCamelException.java
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/MixedTransactionPropagationTest.java
- copied, changed from r886727,
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceTest.java
camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/interceptor/MixedTransactionPropagationTest.xml
- copied, changed from r886727,
camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/interceptor/transactionalClientDataSource.xml
Removed:
camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactedRuntimeCamelException.java
Modified:
camel/trunk/camel-core/src/main/java/org/apache/camel/Exchange.java
camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultExchange.java
camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultUnitOfWork.java
camel/trunk/camel-core/src/main/java/org/apache/camel/model/ProcessorDefinition.java
camel/trunk/camel-core/src/main/java/org/apache/camel/model/RollbackDefinition.java
camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RollbackProcessor.java
camel/trunk/camel-core/src/main/java/org/apache/camel/spi/UnitOfWork.java
camel/trunk/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java
camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactionErrorHandler.java
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/MixedPropagationTransactedTest.java
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/SpringTransactionalClientDataSourceTransactedTest.java
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceMinimalConfigurationTest.java
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceOnExceptionRedeliveryTest.java
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceRedeliveryTest.java
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceTest.java
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceWithOnExceptionRollbackTest.java
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceWithOnExceptionTest.java
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientWithRollbackTest.java
camel/trunk/components/camel-spring/src/test/resources/log4j.properties
camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/interceptor/transactionalClientDataSource.xml
Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/Exchange.java
URL:
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/Exchange.java?rev=886781&r1=886780&r2=886781&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/Exchange.java
(original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/Exchange.java Thu Dec
3 14:06:52 2009
@@ -95,6 +95,7 @@
String REDELIVERED = "CamelRedelivered";
String REDELIVERY_COUNTER = "CamelRedeliveryCounter";
String ROLLBACK_ONLY = "CamelRollbackOnly";
+ String ROLLBACK_ONLY_LAST = "CamelRollbackOnlyLast";
String SPLIT_INDEX = "CamelSplitIndex";
String SPLIT_SIZE = "CamelSplitSize";
Modified:
camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultExchange.java
URL:
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultExchange.java?rev=886781&r1=886780&r2=886781&view=diff
==============================================================================
---
camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultExchange.java
(original)
+++
camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultExchange.java
Thu Dec 3 14:06:52 2009
@@ -268,7 +268,7 @@
}
public boolean isRollbackOnly() {
- return Boolean.TRUE.equals(getProperty(Exchange.ROLLBACK_ONLY));
+ return Boolean.TRUE.equals(getProperty(Exchange.ROLLBACK_ONLY)) ||
Boolean.TRUE.equals(getProperty(Exchange.ROLLBACK_ONLY_LAST));
}
public UnitOfWork getUnitOfWork() {
Modified:
camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultUnitOfWork.java
URL:
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultUnitOfWork.java?rev=886781&r1=886780&r2=886781&view=diff
==============================================================================
---
camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultUnitOfWork.java
(original)
+++
camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultUnitOfWork.java
Thu Dec 3 14:06:52 2009
@@ -17,7 +17,9 @@
package org.apache.camel.impl;
import java.util.ArrayList;
+import java.util.LinkedHashSet;
import java.util.List;
+import java.util.Set;
import org.apache.camel.Exchange;
import org.apache.camel.Message;
@@ -42,12 +44,14 @@
private List<Synchronization> synchronizations;
private Message originalInMessage;
private final TracedRouteNodes tracedRouteNodes;
+ private Set<Object> transactedBy;
public DefaultUnitOfWork(Exchange exchange) {
tracedRouteNodes = new DefaultTracedRouteNodes();
// TODO: optimize to only copy original message if enabled to do so in
the route
// special for JmsMessage as it can cause it to loose headers later.
+ // This will be resolved when we get the message facade with copy on
write implemented
if (exchange.getIn().getClass().getSimpleName().equals("JmsMessage")) {
this.originalInMessage = new DefaultMessage();
this.originalInMessage.setBody(exchange.getIn().getBody());
@@ -77,6 +81,9 @@
if (tracedRouteNodes != null) {
tracedRouteNodes.clear();
}
+ if (transactedBy != null) {
+ transactedBy.clear();
+ }
originalInMessage = null;
}
@@ -158,4 +165,22 @@
return tracedRouteNodes;
}
+ public boolean isTransactedBy(Object transactionDefinition) {
+ return getTransactedBy().contains(transactionDefinition);
+ }
+
+ public void beginTransactedBy(Object transactionDefinition) {
+ getTransactedBy().add(transactionDefinition);
+ }
+
+ public void endTransactedBy(Object transactionDefinition) {
+ getTransactedBy().remove(transactionDefinition);
+ }
+
+ private Set<Object> getTransactedBy() {
+ if (transactedBy == null) {
+ transactedBy = new LinkedHashSet<Object>();
+ }
+ return transactedBy;
+ }
}
Modified:
camel/trunk/camel-core/src/main/java/org/apache/camel/model/ProcessorDefinition.java
URL:
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/model/ProcessorDefinition.java?rev=886781&r1=886780&r2=886781&view=diff
==============================================================================
---
camel/trunk/camel-core/src/main/java/org/apache/camel/model/ProcessorDefinition.java
(original)
+++
camel/trunk/camel-core/src/main/java/org/apache/camel/model/ProcessorDefinition.java
Thu Dec 3 14:06:52 2009
@@ -1458,6 +1458,7 @@
* @return the builder
* @see #rollback()
* @see #rollback(String)
+ * @see #markRollbackOnlyLast()
*/
@SuppressWarnings("unchecked")
public Type markRollbackOnly() {
@@ -1468,6 +1469,27 @@
}
/**
+ * Marks the exchange for rollback only, but only for the last (current)
transaction.
+ * <p/>
+ * A last rollback is used when you have nested transactions and only want
the last local transaction to rollback,
+ * where as the outer transaction can still be completed
+ * <p/>
+ * Does <b>not</b> set any exception as opposed to {...@link #rollback()}
methods.
+ *
+ * @return the builder
+ * @see #rollback()
+ * @see #rollback(String)
+ * @see #markRollbackOnly()
+ */
+ @SuppressWarnings("unchecked")
+ public Type markRollbackOnlyLast() {
+ RollbackDefinition answer = new RollbackDefinition();
+ answer.setMarkRollbackOnlyLast(true);
+ addOutput(answer);
+ return (Type) this;
+ }
+
+ /**
* Marks the exchange for rollback only and sets an exception with a
default message.
* <p/>
* This is done by setting a {...@link
org.apache.camel.RollbackExchangeException} on the Exchange
Modified:
camel/trunk/camel-core/src/main/java/org/apache/camel/model/RollbackDefinition.java
URL:
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/model/RollbackDefinition.java?rev=886781&r1=886780&r2=886781&view=diff
==============================================================================
---
camel/trunk/camel-core/src/main/java/org/apache/camel/model/RollbackDefinition.java
(original)
+++
camel/trunk/camel-core/src/main/java/org/apache/camel/model/RollbackDefinition.java
Thu Dec 3 14:06:52 2009
@@ -37,6 +37,8 @@
@XmlAttribute
private Boolean markRollbackOnly;
@XmlAttribute
+ private Boolean markRollbackOnlyLast;
+ @XmlAttribute
private String message;
public RollbackDefinition() {
@@ -66,8 +68,15 @@
@Override
public Processor createProcessor(RouteContext routeContext) {
+ // validate that only either mark rollbacks is chosen and not both
+ if (markRollbackOnly != null && markRollbackOnly.booleanValue()
+ && markRollbackOnlyLast != null &&
markRollbackOnlyLast.booleanValue()) {
+ throw new IllegalArgumentException("Only either one of
markRollbackOnly and markRollbackOnlyLast is possible to select as true");
+ }
+
RollbackProcessor answer = new RollbackProcessor(message);
answer.setMarkRollbackOnly(markRollbackOnly != null ? markRollbackOnly
: false);
+ answer.setMarkRollbackOnlyLast(markRollbackOnlyLast != null ?
markRollbackOnlyLast : false);
return answer;
}
@@ -84,4 +93,12 @@
public void setMarkRollbackOnly(Boolean markRollbackOnly) {
this.markRollbackOnly = markRollbackOnly;
}
+
+ public Boolean isMarkRollbackOnlyLast() {
+ return markRollbackOnlyLast;
+ }
+
+ public void setMarkRollbackOnlyLast(Boolean markRollbackOnlyLast) {
+ this.markRollbackOnlyLast = markRollbackOnlyLast;
+ }
}
\ No newline at end of file
Modified:
camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RollbackProcessor.java
URL:
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RollbackProcessor.java?rev=886781&r1=886780&r2=886781&view=diff
==============================================================================
---
camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RollbackProcessor.java
(original)
+++
camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RollbackProcessor.java
Thu Dec 3 14:06:52 2009
@@ -28,6 +28,7 @@
public class RollbackProcessor implements Processor, Traceable {
private boolean markRollbackOnly;
+ private boolean markRollbackOnlyLast;
private String message;
public RollbackProcessor() {
@@ -38,10 +39,16 @@
}
public void process(Exchange exchange) throws Exception {
- // mark the exchange for rollback
- exchange.setProperty(Exchange.ROLLBACK_ONLY, Boolean.TRUE);
+ if (isMarkRollbackOnlyLast()) {
+ // only mark the last route (current) as rollback
+ // this is needed when you have multiple transactions in play
+ exchange.setProperty(Exchange.ROLLBACK_ONLY_LAST, Boolean.TRUE);
+ } else {
+ // default to mark the entire route as rollback
+ exchange.setProperty(Exchange.ROLLBACK_ONLY, Boolean.TRUE);
+ }
- if (markRollbackOnly) {
+ if (markRollbackOnly || markRollbackOnlyLast) {
// do not do anything more as we should only mark the rollback
return;
}
@@ -74,4 +81,11 @@
this.markRollbackOnly = markRollbackOnly;
}
+ public boolean isMarkRollbackOnlyLast() {
+ return markRollbackOnlyLast;
+ }
+
+ public void setMarkRollbackOnlyLast(boolean markRollbackOnlyLast) {
+ this.markRollbackOnlyLast = markRollbackOnlyLast;
+ }
}
Modified:
camel/trunk/camel-core/src/main/java/org/apache/camel/spi/UnitOfWork.java
URL:
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/spi/UnitOfWork.java?rev=886781&r1=886780&r2=886781&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/spi/UnitOfWork.java
(original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/spi/UnitOfWork.java
Thu Dec 3 14:06:52 2009
@@ -80,4 +80,34 @@
* @return trace information
*/
TracedRouteNodes getTracedRouteNodes();
+
+ /**
+ * Are we already transacted by the given transaction definition
+ * <p/>
+ * The definition will most likely be a Spring TransactionTemplate when
using Spring Transaction
+ *
+ * @param transactionDefinition the transaction definition
+ * @return <tt>true</tt> if already, <tt>false</tt> otherwise
+ */
+ boolean isTransactedBy(Object transactionDefinition);
+
+ /**
+ * Mark this UnitOfWork as being transacted by the given transaction
definition.
+ * <p/>
+ * The definition will most likely be a Spring TransactionTemplate when
using Spring Transaction
+ * <p/>
+ * When the transaction is completed then invoke the {...@link
#endTransactedBy(Object)} method.
+ *
+ * @param transactionDefinition the transaction definition
+ */
+ void beginTransactedBy(Object transactionDefinition);
+
+ /**
+ * Mark this UnitOfWork as not transacted anymore by the given transaction
definition.
+ * <p/>
+ * The definition will most likely be a Spring TransactionTemplate when
using Spring Transaction
+ *
+ * @param transactionDefinition the transaction definition
+ */
+ void endTransactedBy(Object transactionDefinition);
}
Modified:
camel/trunk/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java
URL:
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java?rev=886781&r1=886780&r2=886781&view=diff
==============================================================================
---
camel/trunk/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java
(original)
+++
camel/trunk/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java
Thu Dec 3 14:06:52 2009
@@ -1059,7 +1059,7 @@
/**
* Cleans the string to pure java identifier so we can use it for loading
class names.
* <p/>
- * Especially from Sping DSL people can have \n \t or other characters
that otherwise
+ * Especially from Spring DSL people can have \n \t or other characters
that otherwise
* would result in ClassNotFoundException
*
* @param name the class name
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=886781&r1=886780&r2=886781&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
Thu Dec 3 14:06:52 2009
@@ -19,17 +19,15 @@
import org.apache.camel.Exchange;
import org.apache.camel.Predicate;
import org.apache.camel.Processor;
+import org.apache.camel.RuntimeCamelException;
import org.apache.camel.processor.Logger;
import org.apache.camel.processor.RedeliveryErrorHandler;
import org.apache.camel.processor.RedeliveryPolicy;
import org.apache.camel.processor.exceptionpolicy.ExceptionPolicyStrategy;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
+import org.apache.camel.util.ObjectHelper;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
-import org.springframework.transaction.support.DefaultTransactionStatus;
import
org.springframework.transaction.support.TransactionCallbackWithoutResult;
-import
org.springframework.transaction.support.TransactionSynchronizationManager;
import org.springframework.transaction.support.TransactionTemplate;
/**
@@ -40,7 +38,6 @@
*/
public class TransactionErrorHandler extends RedeliveryErrorHandler {
- private static final transient Log LOG =
LogFactory.getLog(TransactionErrorHandler.class);
private final TransactionTemplate transactionTemplate;
/**
@@ -78,38 +75,67 @@
}
public void process(final Exchange exchange) throws Exception {
- if (log.isTraceEnabled()) {
- log.trace("Transaction error handler is processing: " + exchange);
+ if (exchange.getUnitOfWork().isTransactedBy(transactionTemplate)) {
+ // already transacted by this transaction template
+ // so lets just let the regular default error handler process it
+ processByRegularErrorHandler(exchange);
+ } else {
+ // not yet wrapped in transaction so lets do that
+ processInTransaction(exchange);
}
+ }
+
+ protected void processByRegularErrorHandler(Exchange exchange) {
+ try {
+ super.process(exchange);
+ } catch (Exception e) {
+ exchange.setException(e);
+ }
+ }
+
+ protected void processInTransaction(final Exchange exchange) throws
Exception {
+ String id = ObjectHelper.getIdentityHashCode(transactionTemplate);
+ try {
+ // mark the beginning of this transaction boundary
+ exchange.getUnitOfWork().beginTransactedBy(transactionTemplate);
+
+ if (log.isDebugEnabled()) {
+ log.debug("Transaction begin (" + id + ") for ExchangeId: " +
exchange.getExchangeId());
+ }
+
+ doInTransactionTemplate(exchange);
+
+ if (log.isDebugEnabled()) {
+ log.debug("Transaction commit (" + id + ") for ExchangeId: " +
exchange.getExchangeId());
+ }
+ } catch (TransactionRollbackException e) {
+ // ignore as its just a dummy exception to force spring TX to
rollback
+ if (log.isDebugEnabled()) {
+ log.debug("Transaction rollback (" + id + ") for ExchangeId: "
+ exchange.getExchangeId());
+ }
+ } catch (Exception e) {
+ log.warn("Transaction rollback (" + id + ") for ExchangeId: " +
exchange.getExchangeId() + " due exception: " + e.getMessage());
+ exchange.setException(e);
+ } finally {
+ // mark the end of this transaction boundary
+ exchange.getUnitOfWork().endTransactedBy(transactionTemplate);
+ }
+ }
+
+ protected void doInTransactionTemplate(final Exchange exchange) {
+
+ // spring transaction template is working best with rollback if you
throw it a runtime exception
+ // otherwise it may not rollback messages send to JMS queues etc.
- // just to let the stacktrace reveal that this is a transaction error
handler
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
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"
- TransactedRuntimeCamelException rce = null;
+ RuntimeCamelException rce = null;
- // find out if there is an actual transaction alive, and thus
we are in transacted mode
- boolean activeTx =
TransactionSynchronizationManager.isActualTransactionActive();
- if (!activeTx) {
- activeTx = status.isNewTransaction() &&
!status.isCompleted();
- if (!activeTx) {
- if
(DefaultTransactionStatus.class.isAssignableFrom(status.getClass())) {
- DefaultTransactionStatus defStatus =
DefaultTransactionStatus.class.cast(status);
- activeTx = defStatus.hasTransaction() &&
!status.isCompleted();
- }
- }
- }
- if (LOG.isTraceEnabled()) {
- LOG.trace("Is actual transaction active: " + activeTx);
- }
-
- // okay mark the exchange as transacted, then the
DeadLetterChannel or others know
- // its a transacted exchange
- if (activeTx) {
- exchange.setProperty(Exchange.TRANSACTED, Boolean.TRUE);
- }
+ exchange.setProperty(Exchange.TRANSACTED, Boolean.TRUE);
+ // and now let process the exchange
try {
TransactionErrorHandler.super.process(exchange);
} catch (Exception e) {
@@ -118,60 +144,30 @@
// after handling and still an exception or marked as rollback
only then rollback
if (exchange.getException() != null ||
exchange.isRollbackOnly()) {
+
+ // if it was a local rollback only then remove its marker
so outer transaction
+ // wont rollback as well (Note: isRollbackOnly() also
returns true for ROLLBACK_ONLY_LAST)
+ exchange.removeProperty(Exchange.ROLLBACK_ONLY_LAST);
+
// wrap exception in transacted exception
if (exchange.getException() != null) {
- rce =
wrapTransactedRuntimeException(exchange.getException());
+ rce =
ObjectHelper.wrapRuntimeCamelException(exchange.getException());
}
- if (activeTx && !status.isRollbackOnly()) {
+ if (!status.isRollbackOnly()) {
status.setRollbackOnly();
- if (LOG.isDebugEnabled()) {
- if (rce != null) {
- LOG.debug("Setting transaction to rollbackOnly
due to exception being thrown: " + rce.getMessage());
- } else {
- LOG.debug("Setting transaction to rollbackOnly
as Exchange was marked as rollback only");
- }
- }
}
// rethrow if an exception occurred
if (rce != null) {
throw rce;
+ } else {
+ // create dummy exception to force spring transaction
manager to rollback
+ throw new TransactionRollbackException();
}
}
}
});
-
- log.trace("Transaction error handler done");
- }
-
- @Override
- protected boolean shouldHandleException(Exchange exchange) {
- boolean answer = false;
- if (exchange.getException() != null) {
- answer = true;
- // handle onException
- // but test beforehand if we have already handled it, if so we
should not do it again
- if (exchange.getException() instanceof
TransactedRuntimeCamelException) {
- TransactedRuntimeCamelException trce =
exchange.getException(TransactedRuntimeCamelException.class);
- answer = !trce.isHandled();
- }
- }
- return answer;
- }
-
- protected TransactedRuntimeCamelException
wrapTransactedRuntimeException(Exception exception) {
- if (exception instanceof TransactedRuntimeCamelException) {
- return (TransactedRuntimeCamelException) exception;
- } else {
- // Mark as handled so we don't want to handle the same exception
twice or more in other
- // wrapped transaction error handlers in this route.
- // We need to mark this information in the exception as we need to
propagate
- // the exception back by rehtrowing it. We cannot mark it on the
exchange as Camel
- // uses copies of exchanges in its pipeline and the data isn't
copied back in case
- // when an exception occurred
- return new TransactedRuntimeCamelException(exception, true);
- }
}
protected String propagationBehaviorToString(int propagationBehavior) {
Copied:
camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactionRollbackException.java
(from r886727,
camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactedRuntimeCamelException.java)
URL:
http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactionRollbackException.java?p2=camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactionRollbackException.java&p1=camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactedRuntimeCamelException.java&r1=886727&r2=886781&rev=886781&view=diff
==============================================================================
---
camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactedRuntimeCamelException.java
(original)
+++
camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactionRollbackException.java
Thu Dec 3 14:06:52 2009
@@ -16,22 +16,18 @@
*/
package org.apache.camel.spring.spi;
-import org.apache.camel.RuntimeCamelException;
-
/**
+ * We use a runtime exception to force Spring transaction manager to rollback
the transaction.
+ *
* @version $Revision$
*/
-public class TransactedRuntimeCamelException extends RuntimeCamelException {
-
- private final boolean handled;
+public class TransactionRollbackException extends RuntimeException {
- public TransactedRuntimeCamelException(Throwable cause, boolean handled) {
- super(cause);
- this.handled = handled;
+ public TransactionRollbackException() {
}
- public boolean isHandled() {
- return handled;
+ @Override
+ public String getMessage() {
+ return "Rollback";
}
-
}
Propchange:
camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactionRollbackException.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactionRollbackException.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Modified:
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/MixedPropagationTransactedTest.java
URL:
http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/MixedPropagationTransactedTest.java?rev=886781&r1=886780&r2=886781&view=diff
==============================================================================
---
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/MixedPropagationTransactedTest.java
(original)
+++
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/MixedPropagationTransactedTest.java
Thu Dec 3 14:06:52 2009
@@ -22,13 +22,12 @@
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.spring.SpringRouteBuilder;
import org.apache.camel.spring.SpringTestSupport;
-import org.apache.camel.spring.spi.TransactedRuntimeCamelException;
import org.springframework.context.support.AbstractXmlApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;
/**
- * For testing with mixed transacted propagations (required, requires new)
+ * For testing with mixed transacted propagation (required, requires new)
*/
public class MixedPropagationTransactedTest extends SpringTestSupport {
@@ -98,8 +97,8 @@
try {
template.sendBody("direct:required", "Donkey in Action");
} catch (RuntimeCamelException e) {
- // expeced as we fail
- assertIsInstanceOf(TransactedRuntimeCamelException.class,
e.getCause());
+ // expected as we fail
+ assertIsInstanceOf(RuntimeCamelException.class, e.getCause());
assertTrue(e.getCause().getCause() instanceof
IllegalArgumentException);
assertEquals("We don't have Donkeys, only Camels",
e.getCause().getCause().getMessage());
}
@@ -113,8 +112,8 @@
try {
template.sendBody("direct:new", "Donkey in Action");
} catch (RuntimeCamelException e) {
- // expeced as we fail
- assertIsInstanceOf(TransactedRuntimeCamelException.class,
e.getCause());
+ // expected as we fail
+ assertIsInstanceOf(RuntimeCamelException.class, e.getCause());
assertTrue(e.getCause().getCause() instanceof
IllegalArgumentException);
assertEquals("We don't have Donkeys, only Camels",
e.getCause().getCause().getMessage());
}
@@ -129,7 +128,7 @@
template.sendBody("direct:new", "Tiger in Action");
} catch (RuntimeCamelException e) {
// expeced as we fail
- assertIsInstanceOf(TransactedRuntimeCamelException.class,
e.getCause());
+ assertIsInstanceOf(RuntimeCamelException.class, e.getCause());
assertTrue(e.getCause().getCause() instanceof
IllegalArgumentException);
assertEquals("We don't have Donkeys, only Camels",
e.getCause().getCause().getMessage());
}
Copied:
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/MixedTransactionPropagationTest.java
(from r886727,
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceTest.java)
URL:
http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/MixedTransactionPropagationTest.java?p2=camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/MixedTransactionPropagationTest.java&p1=camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceTest.java&r1=886727&r2=886781&rev=886781&view=diff
==============================================================================
---
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceTest.java
(original)
+++
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/MixedTransactionPropagationTest.java
Thu Dec 3 14:06:52 2009
@@ -22,8 +22,6 @@
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.spring.SpringRouteBuilder;
import org.apache.camel.spring.SpringTestSupport;
-import org.apache.camel.spring.spi.SpringTransactionPolicy;
-import org.apache.camel.spring.spi.TransactedRuntimeCamelException;
import org.springframework.context.support.AbstractXmlApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;
@@ -31,14 +29,13 @@
/**
* Unit test to demonstrate the transactional client pattern.
*/
-public class TransactionalClientDataSourceTest extends SpringTestSupport {
+public class MixedTransactionPropagationTest extends SpringTestSupport {
protected JdbcTemplate jdbc;
- protected boolean useTransactionErrorHandler = true;
protected AbstractXmlApplicationContext createApplicationContext() {
return new ClassPathXmlApplicationContext(
-
"/org/apache/camel/spring/interceptor/transactionalClientDataSource.xml");
+
"/org/apache/camel/spring/interceptor/MixedTransactionPropagationTest.xml");
}
protected int getExpectedRouteCount() {
@@ -50,13 +47,10 @@
this.disableJMX();
super.setUp();
- // START SNIPPET: e5
- // create database and insert dummy data
final DataSource ds = getMandatoryBean(DataSource.class, "dataSource");
jdbc = new JdbcTemplate(ds);
jdbc.execute("create table books (title varchar(50))");
jdbc.update("insert into books (title) values (?)", new Object[]
{"Camel in Action"});
- // END SNIPPET: e5
}
@Override
@@ -66,22 +60,19 @@
this.enableJMX();
}
- // START SNIPPET: e3
- public void testTransactionSuccess() throws Exception {
+ public void testOkay() throws Exception {
template.sendBody("direct:okay", "Hello World");
int count = jdbc.queryForInt("select count(*) from books");
assertEquals("Number of books", 3, count);
}
- // END SNIPPET: e3
- // START SNIPPET: e4
- public void testTransactionRollback() throws Exception {
+ public void testFail() throws Exception {
try {
template.sendBody("direct:fail", "Hello World");
} catch (RuntimeCamelException e) {
- // expeced as we fail
- assertIsInstanceOf(TransactedRuntimeCamelException.class,
e.getCause());
+ // expected as we fail
+ assertIsInstanceOf(RuntimeCamelException.class, e.getCause());
assertTrue(e.getCause().getCause() instanceof
IllegalArgumentException);
assertEquals("We don't have Donkeys, only Camels",
e.getCause().getCause().getMessage());
}
@@ -89,42 +80,51 @@
int count = jdbc.queryForInt("select count(*) from books");
assertEquals("Number of books", 1, count);
}
- // END SNIPPET: e4
+
+ public void testMixed() throws Exception {
+ template.sendBody("direct:mixed", "Hello World");
+
+ int count = jdbc.queryForInt("select count(*) from books");
+ assertEquals("Number of books", 4, count);
+ }
protected RouteBuilder createRouteBuilder() throws Exception {
- // START SNIPPET: e1
- // Notice that we use the SpringRouteBuilder that has a few more
features than
- // the standard RouteBuilder
return new SpringRouteBuilder() {
public void configure() throws Exception {
- // START SNIPPET: e1
- // lookup the transaction policy
- SpringTransactionPolicy required =
lookup("PROPAGATION_REQUIRED", SpringTransactionPolicy.class);
+ from("direct:okay")
+ .transacted("PROPAGATION_REQUIRED")
+ .setBody(constant("Tiger in
Action")).beanRef("bookService")
+ .setBody(constant("Elephant in
Action")).beanRef("bookService");
+
+ from("direct:fail")
+ .transacted("PROPAGATION_REQUIRED")
+ .setBody(constant("Tiger in
Action")).beanRef("bookService")
+ .setBody(constant("Donkey in
Action")).beanRef("bookService");
- // use this error handler instead of DeadLetterChannel that is
the default
- // Notice: transactionErrorHandler is in SpringRouteBuilder
- if (useTransactionErrorHandler) {
- // useTransactionErrorHandler is only used for unit
testing to reuse code
- // for doing a 2nd test without this transaction error
handler, so ignore
- // this. For spring based transaction, end users are
encouraged to use the
- // transaction error handler instead of the default
DeadLetterChannel.
- errorHandler(transactionErrorHandler(required));
- }
+ // START SNIPPET: e1
+ from("direct:mixed")
+ // using required
+ .transacted("PROPAGATION_REQUIRED")
+ // all these steps will be okay
+ .setBody(constant("Tiger in
Action")).beanRef("bookService")
+ .setBody(constant("Elephant in
Action")).beanRef("bookService")
+ .setBody(constant("Lion in Action")).beanRef("bookService")
+ // continue on route 2
+ .to("direct:mixed2");
+
+ from("direct:mixed2")
+ // using a different propagation which is requires new
+ .transacted("PROPAGATION_REQUIRES_NEW")
+ // tell Camel that if this route fails then only rollback
this last route
+ // by using (rollback only *last*)
+ .onException(Exception.class).markRollbackOnlyLast().end()
+ // this step will be okay
+ .setBody(constant("Giraffe in
Action")).beanRef("bookService")
+ // this step will fail with donkey
+ .setBody(constant("Donkey in
Action")).beanRef("bookService");
// END SNIPPET: e1
-
- // START SNIPPET: e2
- // set the required policy for this route
- from("direct:okay").policy(required).
- setBody(constant("Tiger in
Action")).beanRef("bookService").
- setBody(constant("Elephant in
Action")).beanRef("bookService");
-
- // set the required policy for this route
- from("direct:fail").policy(required).
- setBody(constant("Tiger in
Action")).beanRef("bookService").
- setBody(constant("Donkey in
Action")).beanRef("bookService");
- // END SNIPPET: e2
}
};
}
-}
+}
\ No newline at end of file
Modified:
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/SpringTransactionalClientDataSourceTransactedTest.java
URL:
http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/SpringTransactionalClientDataSourceTransactedTest.java?rev=886781&r1=886780&r2=886781&view=diff
==============================================================================
---
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/SpringTransactionalClientDataSourceTransactedTest.java
(original)
+++
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/SpringTransactionalClientDataSourceTransactedTest.java
Thu Dec 3 14:06:52 2009
@@ -20,7 +20,6 @@
import org.apache.camel.RuntimeCamelException;
import org.apache.camel.spring.SpringTestSupport;
-import org.apache.camel.spring.spi.TransactedRuntimeCamelException;
import org.springframework.context.support.AbstractXmlApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;
@@ -65,8 +64,8 @@
try {
template.sendBody("direct:fail", "Hello World");
} catch (RuntimeCamelException e) {
- // expeced as we fail
- assertIsInstanceOf(TransactedRuntimeCamelException.class,
e.getCause());
+ // expected as we fail
+ assertIsInstanceOf(RuntimeCamelException.class, e.getCause());
assertTrue(e.getCause().getCause() instanceof
IllegalArgumentException);
assertEquals("We don't have Donkeys, only Camels",
e.getCause().getCause().getMessage());
}
Modified:
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceMinimalConfigurationTest.java
URL:
http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceMinimalConfigurationTest.java?rev=886781&r1=886780&r2=886781&view=diff
==============================================================================
---
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceMinimalConfigurationTest.java
(original)
+++
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceMinimalConfigurationTest.java
Thu Dec 3 14:06:52 2009
@@ -20,7 +20,6 @@
import org.apache.camel.RuntimeCamelException;
import org.apache.camel.spring.SpringTestSupport;
-import org.apache.camel.spring.spi.TransactedRuntimeCamelException;
import org.springframework.context.support.AbstractXmlApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;
@@ -65,8 +64,8 @@
try {
template.sendBody("direct:fail", "Hello World");
} catch (RuntimeCamelException e) {
- // expeced as we fail
- assertIsInstanceOf(TransactedRuntimeCamelException.class,
e.getCause());
+ // expected as we fail
+ assertIsInstanceOf(RuntimeCamelException.class, e.getCause());
assertTrue(e.getCause().getCause() instanceof
IllegalArgumentException);
assertEquals("We don't have Donkeys, only Camels",
e.getCause().getCause().getMessage());
}
Modified:
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceOnExceptionRedeliveryTest.java
URL:
http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceOnExceptionRedeliveryTest.java?rev=886781&r1=886780&r2=886781&view=diff
==============================================================================
---
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceOnExceptionRedeliveryTest.java
(original)
+++
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceOnExceptionRedeliveryTest.java
Thu Dec 3 14:06:52 2009
@@ -18,9 +18,9 @@
import org.apache.camel.Exchange;
import org.apache.camel.Processor;
+import org.apache.camel.RuntimeCamelException;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.spring.SpringRouteBuilder;
-import org.apache.camel.spring.spi.TransactedRuntimeCamelException;
/**
* @version $Revision$
@@ -40,7 +40,7 @@
assertNotNull(out);
Exception e = out.getException();
- assertIsInstanceOf(TransactedRuntimeCamelException.class, e);
+ assertIsInstanceOf(RuntimeCamelException.class, e);
assertTrue(e.getCause()instanceof IllegalArgumentException);
assertEquals("We don't have Donkeys, only Camels",
e.getCause().getMessage());
Modified:
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceRedeliveryTest.java
URL:
http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceRedeliveryTest.java?rev=886781&r1=886780&r2=886781&view=diff
==============================================================================
---
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceRedeliveryTest.java
(original)
+++
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceRedeliveryTest.java
Thu Dec 3 14:06:52 2009
@@ -18,9 +18,9 @@
import org.apache.camel.Exchange;
import org.apache.camel.Processor;
+import org.apache.camel.RuntimeCamelException;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.spring.SpringRouteBuilder;
-import org.apache.camel.spring.spi.TransactedRuntimeCamelException;
/**
* @version $Revision$
@@ -40,7 +40,7 @@
assertNotNull(out);
Exception e = out.getException();
- assertIsInstanceOf(TransactedRuntimeCamelException.class, e);
+ assertIsInstanceOf(RuntimeCamelException.class, e);
assertTrue(e.getCause()instanceof IllegalArgumentException);
assertEquals("We don't have Donkeys, only Camels",
e.getCause().getMessage());
Modified:
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceTest.java
URL:
http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceTest.java?rev=886781&r1=886780&r2=886781&view=diff
==============================================================================
---
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceTest.java
(original)
+++
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceTest.java
Thu Dec 3 14:06:52 2009
@@ -23,7 +23,6 @@
import org.apache.camel.spring.SpringRouteBuilder;
import org.apache.camel.spring.SpringTestSupport;
import org.apache.camel.spring.spi.SpringTransactionPolicy;
-import org.apache.camel.spring.spi.TransactedRuntimeCamelException;
import org.springframework.context.support.AbstractXmlApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;
@@ -80,8 +79,8 @@
try {
template.sendBody("direct:fail", "Hello World");
} catch (RuntimeCamelException e) {
- // expeced as we fail
- assertIsInstanceOf(TransactedRuntimeCamelException.class,
e.getCause());
+ // expected as we fail
+ assertIsInstanceOf(RuntimeCamelException.class, e.getCause());
assertTrue(e.getCause().getCause() instanceof
IllegalArgumentException);
assertEquals("We don't have Donkeys, only Camels",
e.getCause().getCause().getMessage());
}
Modified:
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceWithOnExceptionRollbackTest.java
URL:
http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceWithOnExceptionRollbackTest.java?rev=886781&r1=886780&r2=886781&view=diff
==============================================================================
---
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceWithOnExceptionRollbackTest.java
(original)
+++
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceWithOnExceptionRollbackTest.java
Thu Dec 3 14:06:52 2009
@@ -22,7 +22,6 @@
import org.apache.camel.component.mock.MockEndpoint;
import org.apache.camel.spring.SpringRouteBuilder;
import org.apache.camel.spring.spi.SpringTransactionPolicy;
-import org.apache.camel.spring.spi.TransactedRuntimeCamelException;
/**
* Unit test to demonstrate the transactional client pattern.
@@ -41,7 +40,7 @@
template.sendBody("direct:fail", "Hello World");
} catch (RuntimeCamelException e) {
// expected as we fail
- assertIsInstanceOf(TransactedRuntimeCamelException.class,
e.getCause());
+ assertIsInstanceOf(RuntimeCamelException.class, e.getCause());
RollbackExchangeException rollback =
assertIsInstanceOf(RollbackExchangeException.class, e.getCause().getCause());
assertEquals("Donkey in Action",
rollback.getExchange().getIn().getBody());
}
Modified:
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceWithOnExceptionTest.java
URL:
http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceWithOnExceptionTest.java?rev=886781&r1=886780&r2=886781&view=diff
==============================================================================
---
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceWithOnExceptionTest.java
(original)
+++
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceWithOnExceptionTest.java
Thu Dec 3 14:06:52 2009
@@ -21,7 +21,6 @@
import org.apache.camel.component.mock.MockEndpoint;
import org.apache.camel.spring.SpringRouteBuilder;
import org.apache.camel.spring.spi.SpringTransactionPolicy;
-import org.apache.camel.spring.spi.TransactedRuntimeCamelException;
/**
* Unit test to demonstrate the transactional client pattern.
@@ -39,8 +38,8 @@
try {
template.sendBody("direct:fail", "Hello World");
} catch (RuntimeCamelException e) {
- // expeced as we fail
- assertIsInstanceOf(TransactedRuntimeCamelException.class,
e.getCause());
+ // expected as we fail
+ assertIsInstanceOf(RuntimeCamelException.class, e.getCause());
assertTrue(e.getCause().getCause() instanceof
IllegalArgumentException);
assertEquals("We don't have Donkeys, only Camels",
e.getCause().getCause().getMessage());
}
Modified:
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientWithRollbackTest.java
URL:
http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientWithRollbackTest.java?rev=886781&r1=886780&r2=886781&view=diff
==============================================================================
---
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientWithRollbackTest.java
(original)
+++
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientWithRollbackTest.java
Thu Dec 3 14:06:52 2009
@@ -24,7 +24,6 @@
import org.apache.camel.spring.SpringRouteBuilder;
import org.apache.camel.spring.SpringTestSupport;
import org.apache.camel.spring.spi.SpringTransactionPolicy;
-import org.apache.camel.spring.spi.TransactedRuntimeCamelException;
import org.springframework.context.support.AbstractXmlApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;
@@ -75,7 +74,7 @@
template.sendBody("direct:fail", "Hello World");
fail("Should have thrown a RollbackExchangeException");
} catch (RuntimeCamelException e) {
- assertIsInstanceOf(TransactedRuntimeCamelException.class,
e.getCause());
+ assertIsInstanceOf(RuntimeCamelException.class, e.getCause());
assertTrue(e.getCause().getCause() instanceof
RollbackExchangeException);
}
Modified:
camel/trunk/components/camel-spring/src/test/resources/log4j.properties
URL:
http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/resources/log4j.properties?rev=886781&r1=886780&r2=886781&view=diff
==============================================================================
--- camel/trunk/components/camel-spring/src/test/resources/log4j.properties
(original)
+++ camel/trunk/components/camel-spring/src/test/resources/log4j.properties Thu
Dec 3 14:06:52 2009
@@ -26,6 +26,7 @@
log4j.logger.org.apache.camel.impl.DefaultPackageScanClassResolver=WARN
#log4j.logger.org.apache.camel=DEBUG
+#log4j.logger.org.apache.camel.spring.spi=DEBUG
# CONSOLE appender not used by default
log4j.appender.out=org.apache.log4j.ConsoleAppender
Copied:
camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/interceptor/MixedTransactionPropagationTest.xml
(from r886727,
camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/interceptor/transactionalClientDataSource.xml)
URL:
http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/interceptor/MixedTransactionPropagationTest.xml?p2=camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/interceptor/MixedTransactionPropagationTest.xml&p1=camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/interceptor/transactionalClientDataSource.xml&r1=886727&r2=886781&rev=886781&view=diff
==============================================================================
---
camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/interceptor/transactionalClientDataSource.xml
(original)
+++
camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/interceptor/MixedTransactionPropagationTest.xml
Thu Dec 3 14:06:52 2009
@@ -21,8 +21,6 @@
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://camel.apache.org/schema/spring
http://camel.apache.org/schema/spring/camel-spring.xsd">
- <!-- START SNIPPET: e1 -->
- <!-- datasource to the database -->
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
<property name="url" value="jdbc:hsqldb:mem:camel"/>
@@ -30,20 +28,24 @@
<property name="password" value=""/>
</bean>
- <!-- spring transaction manager -->
<bean id="txManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
- <!-- policy for required transaction used in our Camel routes -->
+ <!-- START SNIPPET: e1 -->
<bean id="PROPAGATION_REQUIRED"
class="org.apache.camel.spring.spi.SpringTransactionPolicy">
<property name="transactionManager" ref="txManager"/>
+ <property name="propagationBehaviorName" value="PROPAGATION_REQUIRED"/>
</bean>
- <!-- bean for book business logic -->
+ <bean id="PROPAGATION_REQUIRES_NEW"
class="org.apache.camel.spring.spi.SpringTransactionPolicy">
+ <property name="transactionManager" ref="txManager"/>
+ <property name="propagationBehaviorName"
value="PROPAGATION_REQUIRES_NEW"/>
+ </bean>
+ <!-- END SNIPPET: e1 -->
+
<bean id="bookService"
class="org.apache.camel.spring.interceptor.BookService">
<property name="dataSource" ref="dataSource"/>
</bean>
- <!-- END SNIPPET: e1 -->
</beans>
Modified:
camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/interceptor/transactionalClientDataSource.xml
URL:
http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/interceptor/transactionalClientDataSource.xml?rev=886781&r1=886780&r2=886781&view=diff
==============================================================================
---
camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/interceptor/transactionalClientDataSource.xml
(original)
+++
camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/interceptor/transactionalClientDataSource.xml
Thu Dec 3 14:06:52 2009
@@ -38,6 +38,7 @@
<!-- policy for required transaction used in our Camel routes -->
<bean id="PROPAGATION_REQUIRED"
class="org.apache.camel.spring.spi.SpringTransactionPolicy">
<property name="transactionManager" ref="txManager"/>
+ <property name="propagationBehaviorName" value="PROPAGATION_REQUIRED"/>
</bean>
<!-- bean for book business logic -->