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 2012/02/01 11:43:13 UTC

svn commit: r1239045 - in /camel/trunk/components: camel-jms/src/test/resources/org/apache/camel/component/jms/tx/ camel-spring/src/main/java/org/apache/camel/spring/ camel-spring/src/main/java/org/apache/camel/spring/handler/ camel-spring/src/main/jav...

Author: davsclaus
Date: Wed Feb  1 10:43:12 2012
New Revision: 1239045

URL: http://svn.apache.org/viewvc?rev=1239045&view=rev
Log:
CAMEL-4965: Allow to configure transaction error handler rollback logging level.

Modified:
    camel/trunk/components/camel-jms/src/test/resources/org/apache/camel/component/jms/tx/JMSTransactionIsTransactedRedeliveredTest.xml
    camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/ErrorHandlerDefinition.java
    camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/handler/ErrorHandlerDefinitionParser.java
    camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactionErrorHandler.java
    camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactionErrorHandlerBuilder.java

Modified: camel/trunk/components/camel-jms/src/test/resources/org/apache/camel/component/jms/tx/JMSTransactionIsTransactedRedeliveredTest.xml
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-jms/src/test/resources/org/apache/camel/component/jms/tx/JMSTransactionIsTransactedRedeliveredTest.xml?rev=1239045&r1=1239044&r2=1239045&view=diff
==============================================================================
--- camel/trunk/components/camel-jms/src/test/resources/org/apache/camel/component/jms/tx/JMSTransactionIsTransactedRedeliveredTest.xml (original)
+++ camel/trunk/components/camel-jms/src/test/resources/org/apache/camel/component/jms/tx/JMSTransactionIsTransactedRedeliveredTest.xml Wed Feb  1 10:43:12 2012
@@ -46,8 +46,8 @@
 
     <camelContext xmlns="http://camel.apache.org/schema/spring">
 
-      <!-- we do not want any exceptions to be logged -->
-      <errorHandler id="txEH" type="TransactionErrorHandler">
+      <!-- we do not want any exceptions to be logged, neither that a rollback occurred -->
+      <errorHandler id="txEH" type="TransactionErrorHandler" rollbackLoggingLevel="ERROR">
         <redeliveryPolicy logStackTrace="false" logExhausted="false"/>
       </errorHandler>
 

Modified: camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/ErrorHandlerDefinition.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/ErrorHandlerDefinition.java?rev=1239045&r1=1239044&r2=1239045&view=diff
==============================================================================
--- camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/ErrorHandlerDefinition.java (original)
+++ camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/ErrorHandlerDefinition.java Wed Feb  1 10:43:12 2012
@@ -42,6 +42,8 @@ public class ErrorHandlerDefinition exte
     @XmlAttribute
     private LoggingLevel level = LoggingLevel.ERROR;
     @XmlAttribute
+    private LoggingLevel rollbackLoggingLevel = LoggingLevel.WARN;
+    @XmlAttribute
     private String logName;
     @XmlAttribute
     private Boolean useOriginalMessage;
@@ -60,5 +62,4 @@ public class ErrorHandlerDefinition exte
     @XmlElement
     private RedeliveryPolicyDefinition redeliveryPolicy;
 
-   
 }

Modified: camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/handler/ErrorHandlerDefinitionParser.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/handler/ErrorHandlerDefinitionParser.java?rev=1239045&r1=1239044&r2=1239045&view=diff
==============================================================================
--- camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/handler/ErrorHandlerDefinitionParser.java (original)
+++ camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/handler/ErrorHandlerDefinitionParser.java Wed Feb  1 10:43:12 2012
@@ -102,7 +102,6 @@ public class ErrorHandlerDefinitionParse
             parserRefAttribute(element, "onRetryWhileRef", "onRetryWhile", builder);
             parserRefAttribute(element, "redeliveryPolicyRef", "redeliveryPolicy", builder);
             if (type.equals(ErrorHandlerType.TransactionErrorHandler)) {
-                // deal with transactionTemplateRef
                 parserRefAttribute(element, "transactionTemplateRef", "transactionTemplate", builder);
                 parserRefAttribute(element, "transactionManagerRef", "transactionManager", builder);
             }
@@ -125,6 +124,11 @@ public class ErrorHandlerDefinitionParse
             throw new IllegalArgumentException("Attribute transactionManagerRef can only be used if type is "
                     + ErrorHandlerType.TransactionErrorHandler.name() + ", in error handler with id: " + id);
         }
+        String rollbackLoggingLevel = element.getAttribute("rollbackLoggingLevel");
+        if (ObjectHelper.isNotEmpty(rollbackLoggingLevel) && (!type.equals(ErrorHandlerType.TransactionErrorHandler))) {
+            throw new IllegalArgumentException("Attribute rollbackLoggingLevel can only be used if type is "
+                    + ErrorHandlerType.TransactionErrorHandler.name() + ", in error handler with id: " + id);
+        }
         String useOriginalMessage = element.getAttribute("useOriginalMessage");
         if (ObjectHelper.isNotEmpty(useOriginalMessage) && (type.equals(ErrorHandlerType.LoggingErrorHandler) || type.equals(ErrorHandlerType.NoErrorHandler))) {
             throw new IllegalArgumentException("Attribute useOriginalMessage is not supported by error handler type: "

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=1239045&r1=1239044&r2=1239045&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 Feb  1 10:43:12 2012
@@ -19,6 +19,7 @@ package org.apache.camel.spring.spi;
 import org.apache.camel.AsyncCallback;
 import org.apache.camel.CamelContext;
 import org.apache.camel.Exchange;
+import org.apache.camel.LoggingLevel;
 import org.apache.camel.Predicate;
 import org.apache.camel.Processor;
 import org.apache.camel.processor.RedeliveryErrorHandler;
@@ -42,6 +43,7 @@ public class TransactionErrorHandler ext
 
     private final TransactionTemplate transactionTemplate;
     private final String transactionKey;
+    private final LoggingLevel rollbackLoggingLevel;
 
     /**
      * Creates the transaction error handler.
@@ -55,14 +57,17 @@ public class TransactionErrorHandler ext
      * @param transactionTemplate     the transaction template
      * @param retryWhile              retry while
      * @param executorServiceRef      reference to a {@link java.util.concurrent.ScheduledExecutorService} to be used for redelivery thread pool. Can be <tt>null</tt>.
+     * @param rollbackLoggingLevel    logging level to use for logging transaction rollback occurred
      */
     public TransactionErrorHandler(CamelContext camelContext, Processor output, CamelLogger logger, 
             Processor redeliveryProcessor, RedeliveryPolicy redeliveryPolicy, ExceptionPolicyStrategy exceptionPolicyStrategy,
-            TransactionTemplate transactionTemplate, Predicate retryWhile, String executorServiceRef) {
+            TransactionTemplate transactionTemplate, Predicate retryWhile, String executorServiceRef,
+            LoggingLevel rollbackLoggingLevel) {
 
         super(camelContext, output, logger, redeliveryProcessor, redeliveryPolicy, null, null, false, retryWhile, executorServiceRef);
         setExceptionPolicy(exceptionPolicyStrategy);
         this.transactionTemplate = transactionTemplate;
+        this.rollbackLoggingLevel = rollbackLoggingLevel;
         this.transactionKey = ObjectHelper.getIdentityHashCode(transactionTemplate);
     }
 
@@ -136,8 +141,8 @@ public class TransactionErrorHandler ext
                 log.debug("Transaction rollback ({}) redelivered({}) for {} due exchange was marked for rollbackOnly", new Object[]{transactionKey, redelivered, ids});
             }
         } catch (Throwable e) {
-            log.warn("Transaction rollback ({}) redelivered({}) for {} caught: {}", new Object[]{transactionKey, redelivered, ids, e.getMessage()});
             exchange.setException(e);
+            logTransactionRollback(redelivered, ids, e);
         } finally {
             // mark the end of this transaction boundary
             exchange.getUnitOfWork().endTransactedBy(transactionKey);
@@ -146,6 +151,7 @@ public class TransactionErrorHandler ext
         // if it was a local rollback only then remove its marker so outer transaction wont see the marker
         Boolean onlyLast = (Boolean) exchange.removeProperty(Exchange.ROLLBACK_ONLY_LAST);
         if (onlyLast != null && onlyLast) {
+            // we only want this logged at debug level
             if (log.isDebugEnabled()) {
                 // log exception if there was a cause exception so we have the stack trace
                 Exception cause = exchange.getException();
@@ -222,6 +228,25 @@ public class TransactionErrorHandler ext
         });
     }
 
+    /**
+     * Logs the transaction rollback
+     */
+    private void logTransactionRollback(String redelivered, String ids, Throwable e) {
+        if (rollbackLoggingLevel == LoggingLevel.OFF) {
+            return;
+        } else if (rollbackLoggingLevel == LoggingLevel.ERROR && log.isErrorEnabled()) {
+            log.error("Transaction rollback ({}) redelivered({}) for {} caught: {}", new Object[]{transactionKey, redelivered, ids, e.getMessage()});
+        } else if (rollbackLoggingLevel == LoggingLevel.WARN && log.isWarnEnabled()) {
+            log.warn("Transaction rollback ({}) redelivered({}) for {} caught: {}", new Object[]{transactionKey, redelivered, ids, e.getMessage()});
+        } else if (rollbackLoggingLevel == LoggingLevel.INFO && log.isInfoEnabled()) {
+            log.info("Transaction rollback ({}) redelivered({}) for {} caught: {}", new Object[]{transactionKey, redelivered, ids, e.getMessage()});
+        } else if (rollbackLoggingLevel == LoggingLevel.DEBUG && log.isDebugEnabled()) {
+            log.debug("Transaction rollback ({}) redelivered({}) for {} caught: {}", new Object[]{transactionKey, redelivered, ids, e.getMessage()});
+        } else if (rollbackLoggingLevel == LoggingLevel.TRACE && log.isTraceEnabled()) {
+            log.trace("Transaction rollback ({}) redelivered({}) for {} caught: {}", new Object[]{transactionKey, redelivered, ids, e.getMessage()});
+        }
+    }
+
     private static String propagationBehaviorToString(int propagationBehavior) {
         String rc;
         switch (propagationBehavior) {

Modified: camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactionErrorHandlerBuilder.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactionErrorHandlerBuilder.java?rev=1239045&r1=1239044&r2=1239045&view=diff
==============================================================================
--- camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactionErrorHandlerBuilder.java (original)
+++ camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactionErrorHandlerBuilder.java Wed Feb  1 10:43:12 2012
@@ -40,6 +40,7 @@ public class TransactionErrorHandlerBuil
     private static final transient Logger LOG = LoggerFactory.getLogger(TransactionErrorHandlerBuilder.class);
     private static final String PROPAGATION_REQUIRED = "PROPAGATION_REQUIRED";
     private TransactionTemplate transactionTemplate;
+    private LoggingLevel rollbackLoggingLevel = LoggingLevel.WARN;
 
     public TransactionErrorHandlerBuilder() {
         // no-arg constructor used by Spring DSL
@@ -108,7 +109,7 @@ public class TransactionErrorHandlerBuil
 
         TransactionErrorHandler answer = new TransactionErrorHandler(routeContext.getCamelContext(), processor,
             getLogger(), getOnRedelivery(), getRedeliveryPolicy(), getExceptionPolicyStrategy(), transactionTemplate, 
-            getRetryWhilePolicy(routeContext.getCamelContext()), getExecutorServiceRef());
+            getRetryWhilePolicy(routeContext.getCamelContext()), getExecutorServiceRef(), getRollbackLoggingLevel());
         // configure error handler before we can use it
         configure(routeContext, answer);
         return answer;
@@ -126,9 +127,39 @@ public class TransactionErrorHandlerBuil
         this.transactionTemplate = new TransactionTemplate(transactionManager);
     }
 
+    public LoggingLevel getRollbackLoggingLevel() {
+        return rollbackLoggingLevel;
+    }
+
+    /**
+     * Sets the logging level to use for logging transactional rollback.
+     * <p/>
+     * This option is default WARN.
+     *
+     * @param rollbackLoggingLevel the logging level
+     */
+    public void setRollbackLoggingLevel(LoggingLevel rollbackLoggingLevel) {
+        this.rollbackLoggingLevel = rollbackLoggingLevel;
+    }
+
     // Builder methods
     // -------------------------------------------------------------------------
 
+    /**
+     * Sets the logging level to use for logging transactional rollback.
+     * <p/>
+     * This option is default WARN.
+     *
+     * @param rollbackLoggingLevel the logging level
+     */
+    public TransactionErrorHandlerBuilder rollbackLoggingLevel(LoggingLevel rollbackLoggingLevel) {
+        setRollbackLoggingLevel(rollbackLoggingLevel);
+        return this;
+    }
+
+    // Implementation
+    // -------------------------------------------------------------------------
+
     protected CamelLogger createLogger() {
         return new CamelLogger(LoggerFactory.getLogger(TransactionErrorHandler.class), LoggingLevel.ERROR);
     }