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 2009/12/16 15:38:44 UTC

svn commit: r891253 - in /camel/trunk: camel-core/src/main/java/org/apache/camel/ camel-core/src/main/java/org/apache/camel/component/seda/ camel-core/src/main/java/org/apache/camel/component/timer/ camel-core/src/main/java/org/apache/camel/impl/ camel...

Author: davsclaus
Date: Wed Dec 16 14:38:44 2009
New Revision: 891253

URL: http://svn.apache.org/viewvc?rev=891253&view=rev
Log:
CAMEL-2295, CAMEL-2296: RedeliveryErrorHandler will now log at ERROR level when exhausted. Improved ExceptionHandler to have additional log information.

Modified:
    camel/trunk/camel-core/src/main/java/org/apache/camel/CamelExchangeException.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/component/seda/SedaConsumer.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/component/timer/TimerConsumer.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/impl/LoggingExceptionHandler.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RedeliveryErrorHandler.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/spi/ExceptionHandler.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/util/ExchangeHelper.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/issues/CharlesSplitAndTryCatchRollbackIssueTest.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/processor/MulticastParallelStopOnExceptionTest.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/processor/MulticastStopOnExceptionTest.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/processor/RollbackCustomMessageTest.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/processor/SplitterParallelStopOnExceptionTest.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/processor/SplitterStopOnExceptionTest.java
    camel/trunk/components/camel-quartz/src/main/java/org/apache/camel/component/quartz/QuartzEndpoint.java

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/CamelExchangeException.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/CamelExchangeException.java?rev=891253&r1=891252&r2=891253&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/CamelExchangeException.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/CamelExchangeException.java Wed Dec 16 14:38:44 2009
@@ -16,6 +16,8 @@
  */
 package org.apache.camel;
 
+import org.apache.camel.util.ExchangeHelper;
+
 /**
  * An exception caused by a specific message {@link Exchange}
  *
@@ -27,12 +29,12 @@
     private final transient Exchange exchange;
 
     public CamelExchangeException(String message, Exchange exchange) {
-        super(createMessage(message, exchange));
+        super(ExchangeHelper.createExceptionMessage(message, exchange, null));
         this.exchange = exchange;
     }
 
     public CamelExchangeException(String message, Exchange exchange, Throwable cause) {
-        super(createMessage(message, exchange, cause), cause);
+        super(ExchangeHelper.createExceptionMessage(message, exchange, cause), cause);
         this.exchange = exchange;
     }
 
@@ -43,11 +45,4 @@
         return exchange;
     }
 
-    protected static String createMessage(String message, Exchange exchange) {
-        return message + " on the exchange: " + exchange;
-    }
-
-    protected static String createMessage(String message, Exchange exchange, Throwable cause) {
-        return createMessage(message, exchange) + ". Cause by: [" + cause.getClass().getName() + " - " + cause.getMessage() + "]";
-    }
 }

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/component/seda/SedaConsumer.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/component/seda/SedaConsumer.java?rev=891253&r1=891252&r2=891253&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/component/seda/SedaConsumer.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/component/seda/SedaConsumer.java Wed Dec 16 14:38:44 2009
@@ -94,8 +94,13 @@
                 if (isRunAllowed()) {
                     try {
                         sendToConsumers(exchange);
+
+                        // log exception if an exception occurred and was not handled
+                        if (exchange.getException() != null) {
+                            getExceptionHandler().handleException("Error processing exchange", exchange, exchange.getException());
+                        }
                     } catch (Exception e) {
-                        getExceptionHandler().handleException(e);
+                        getExceptionHandler().handleException("Error processing exchange", exchange, e);
                     }
                 } else {
                     if (LOG.isWarnEnabled()) {

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/component/timer/TimerConsumer.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/component/timer/TimerConsumer.java?rev=891253&r1=891252&r2=891253&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/component/timer/TimerConsumer.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/component/timer/TimerConsumer.java Wed Dec 16 14:38:44 2009
@@ -104,10 +104,10 @@
 
             // log exception if an exception occurred and was not handled
             if (exchange.getException() != null) {
-                handleException(exchange.getException());
+                getExceptionHandler().handleException("Error processing exchange", exchange, exchange.getException());
             }
         } catch (Exception e) {
-            handleException(e);
+            getExceptionHandler().handleException("Error processing exchange", exchange, exchange.getException());
         }
     }
 }

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/impl/LoggingExceptionHandler.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/LoggingExceptionHandler.java?rev=891253&r1=891252&r2=891253&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/impl/LoggingExceptionHandler.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/impl/LoggingExceptionHandler.java Wed Dec 16 14:38:44 2009
@@ -16,10 +16,13 @@
  */
 package org.apache.camel.impl;
 
+import org.apache.camel.CamelExchangeException;
+import org.apache.camel.Exchange;
 import org.apache.camel.LoggingLevel;
 import org.apache.camel.RollbackExchangeException;
 import org.apache.camel.processor.Logger;
 import org.apache.camel.spi.ExceptionHandler;
+import org.apache.camel.util.ExchangeHelper;
 import org.apache.commons.logging.LogFactory;
 
 /**
@@ -40,11 +43,20 @@
     }
 
     public void handleException(Throwable exception) {
+        handleException(null, null, exception);
+    }
+
+    public void handleException(String message, Throwable exception) {
+        handleException(message, null, exception);
+    }
+
+    public void handleException(String message, Exchange exchange, Throwable exception) {
+        String msg = ExchangeHelper.createExceptionMessage(message, exchange, exception);
         if (isCausedByRollbackExchangeException(exception)) {
             // do not log stacktrace for intended rollbacks
-            logger.log(exception.getMessage());
+            logger.log(msg);
         } else {
-            logger.log(exception.getMessage(), exception);
+            logger.log(msg, exception);
         }
     }
 

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RedeliveryErrorHandler.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RedeliveryErrorHandler.java?rev=891253&r1=891252&r2=891253&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RedeliveryErrorHandler.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RedeliveryErrorHandler.java Wed Dec 16 14:38:44 2009
@@ -282,7 +282,7 @@
     }
 
     protected void handleException(Exchange exchange, RedeliveryData data) {
-        Throwable e = exchange.getException();
+        Exception e = exchange.getException();
 
         // store the original caused exception in a property, so we can restore it later
         exchange.setProperty(Exchange.EXCEPTION_CAUGHT, e);
@@ -341,6 +341,9 @@
      */
     protected void deliverToFailureProcessor(final Processor processor, final Exchange exchange,
                                              final RedeliveryData data) {
+
+        Exception caught = exchange.getException();
+
         // we did not success with the redelivery so now we let the failure processor handle it
         // clear exception as we let the failure processor handle it
         exchange.setException(null);
@@ -380,11 +383,17 @@
                 exchange.setException(e);
             }
             log.trace("Failure processor done");
+        }
 
-            String msg = "Failed delivery for exchangeId: " + exchange.getExchangeId()
-                    + ". Processed by failure processor: " + processor;
-            logFailedDelivery(false, exchange, msg, data, null);
+        // create log message
+        String msg = "Failed delivery for exchangeId: " + exchange.getExchangeId();
+        msg = msg + ". Exhausted after delivery attempt: " + data.redeliveryCounter + " caught: " + caught;
+        if (processor != null) {
+            msg = msg + ". Processed by failure processor: " + processor;
         }
+
+        // log that we failed delivery as we are exhausted
+        logFailedDelivery(false, exchange, msg, data, null);
     }
 
     protected void prepareExchangeAfterFailure(final Exchange exchange, final RedeliveryData data) {
@@ -445,7 +454,7 @@
                 msg = msg + " due: " + exchange.getException().getMessage();
             }
             if (newLogLevel == LoggingLevel.ERROR || newLogLevel == LoggingLevel.FATAL) {
-                // log intented rollback on maximum WARN level (no ERROR or FATAL)
+                // log intended rollback on maximum WARN level (no ERROR or FATAL)
                 logger.log(msg, LoggingLevel.WARN);
             } else {
                 // otherwise use the desired logging level

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/spi/ExceptionHandler.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/spi/ExceptionHandler.java?rev=891253&r1=891252&r2=891253&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/spi/ExceptionHandler.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/spi/ExceptionHandler.java Wed Dec 16 14:38:44 2009
@@ -16,6 +16,8 @@
  */
 package org.apache.camel.spi;
 
+import org.apache.camel.Exchange;
+
 /**
  * A Strategy pattern for handling exceptions; particularly in asynchronous processes such as consumers
  *
@@ -29,4 +31,21 @@
      * @param exception the exception
      */
     void handleException(Throwable exception);
+
+    /**
+     * Handles the given exception
+     *
+     * @param message additional message
+     * @param exception the exception
+     */
+    void handleException(String message, Throwable exception);
+
+    /**
+     * Handles the given exception
+     *
+     * @param message additional message
+     * @param exchange exchange which cause the exception
+     * @param exception the exception
+     */
+    void handleException(String message, Exchange exchange, Throwable exception);
 }

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/util/ExchangeHelper.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/util/ExchangeHelper.java?rev=891253&r1=891252&r2=891253&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/util/ExchangeHelper.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/util/ExchangeHelper.java Wed Dec 16 14:38:44 2009
@@ -560,4 +560,34 @@
         return context.getTypeConverter().convertTo(type, result);
     }
 
+    /**
+     * Creates an exception message with the provided details.
+     * <p/>
+     * All fields is optional so you can pass in only an exception, or just a message etc. or any combination.
+     *
+     * @param message the message
+     * @param exchange the exchange
+     * @param cause the caused exception
+     * @return an error message (without stacktrace from exception)
+     */
+    public static String createExceptionMessage(String message, Exchange exchange, Throwable cause) {
+        StringBuilder sb = new StringBuilder();
+        if (message != null) {
+            sb.append(message);
+        }
+        if (exchange != null) {
+            if (sb.length() > 0) {
+                sb.append(". ");
+            }
+            sb.append(exchange);
+        }
+        if (cause != null) {
+            if (sb.length() > 0) {
+                sb.append(". ");
+            }
+            sb.append("Caused by: [" + cause.getClass().getName() + " - " + cause.getMessage() + "]");
+        }
+        return sb.toString().trim();
+    }
+
 }

Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/issues/CharlesSplitAndTryCatchRollbackIssueTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/issues/CharlesSplitAndTryCatchRollbackIssueTest.java?rev=891253&r1=891252&r2=891253&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/issues/CharlesSplitAndTryCatchRollbackIssueTest.java (original)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/issues/CharlesSplitAndTryCatchRollbackIssueTest.java Wed Dec 16 14:38:44 2009
@@ -72,9 +72,9 @@
             fail("Should thrown an exception");
         } catch (CamelExecutionException e) {
             CamelExchangeException ee = assertIsInstanceOf(CamelExchangeException.class, e.getCause());
-            assertTrue(ee.getMessage().startsWith("Sequential processing failed for number 2 on the exchange: Exchange[Message: Kaboom]"));
+            assertTrue(ee.getMessage().startsWith("Sequential processing failed for number 2. Exchange[Message: Kaboom]"));
             RollbackExchangeException re = assertIsInstanceOf(RollbackExchangeException.class, ee.getCause());
-            assertEquals("Intended rollback on the exchange: Exchange[Message: Kaboom]", re.getMessage());
+            assertEquals("Intended rollback. Exchange[Message: Kaboom]", re.getMessage());
         }
 
         assertMockEndpointsSatisfied();
@@ -94,9 +94,9 @@
             fail("Should thrown an exception");
         } catch (CamelExecutionException e) {
             CamelExchangeException ee = assertIsInstanceOf(CamelExchangeException.class, e.getCause());
-            assertTrue(ee.getMessage().startsWith("Sequential processing failed for number 3 on the exchange: Exchange[Message: Kaboom]"));
+            assertTrue(ee.getMessage().startsWith("Sequential processing failed for number 3. Exchange[Message: Kaboom]"));
             RollbackExchangeException re = assertIsInstanceOf(RollbackExchangeException.class, ee.getCause());
-            assertEquals("Intended rollback on the exchange: Exchange[Message: Kaboom]", re.getMessage());
+            assertEquals("Intended rollback. Exchange[Message: Kaboom]", re.getMessage());
         }
 
         assertMockEndpointsSatisfied();

Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/processor/MulticastParallelStopOnExceptionTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/MulticastParallelStopOnExceptionTest.java?rev=891253&r1=891252&r2=891253&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/processor/MulticastParallelStopOnExceptionTest.java (original)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/processor/MulticastParallelStopOnExceptionTest.java Wed Dec 16 14:38:44 2009
@@ -57,7 +57,7 @@
             ExecutionException ee = assertIsInstanceOf(ExecutionException.class, e.getCause());
             CamelExchangeException cause = assertIsInstanceOf(CamelExchangeException.class, ee.getCause());
             assertTrue(cause.getMessage().startsWith("Parallel processing failed for number "));
-            assertTrue(cause.getMessage().contains("on the exchange: Exchange[Message: Kaboom]"));
+            assertTrue(cause.getMessage().contains("Exchange[Message: Kaboom]"));
             assertEquals("Forced", cause.getCause().getMessage());
         }
 

Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/processor/MulticastStopOnExceptionTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/MulticastStopOnExceptionTest.java?rev=891253&r1=891252&r2=891253&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/processor/MulticastStopOnExceptionTest.java (original)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/processor/MulticastStopOnExceptionTest.java Wed Dec 16 14:38:44 2009
@@ -51,7 +51,7 @@
             fail("Should thrown an exception");
         } catch (CamelExecutionException e) {
             CamelExchangeException cause = assertIsInstanceOf(CamelExchangeException.class, e.getCause());
-            assertTrue(cause.getMessage().startsWith("Sequential processing failed for number 1 on the exchange: Exchange[Message: Kaboom]"));
+            assertTrue(cause.getMessage().startsWith("Sequential processing failed for number 1. Exchange[Message: Kaboom]"));
             assertEquals("Forced", cause.getCause().getMessage());
         }
 

Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/processor/RollbackCustomMessageTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/RollbackCustomMessageTest.java?rev=891253&r1=891252&r2=891253&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/processor/RollbackCustomMessageTest.java (original)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/processor/RollbackCustomMessageTest.java Wed Dec 16 14:38:44 2009
@@ -32,7 +32,7 @@
             fail("Should have thrown an exception");
         } catch (CamelExecutionException e) {
             assertIsInstanceOf(RollbackExchangeException.class, e.getCause());
-            assertEquals("boo on the exchange: Exchange[Message: Hello World]", e.getCause().getMessage());
+            assertEquals("boo. Exchange[Message: Hello World]", e.getCause().getMessage());
         }
     }
 

Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/processor/SplitterParallelStopOnExceptionTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/SplitterParallelStopOnExceptionTest.java?rev=891253&r1=891252&r2=891253&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/processor/SplitterParallelStopOnExceptionTest.java (original)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/processor/SplitterParallelStopOnExceptionTest.java Wed Dec 16 14:38:44 2009
@@ -53,7 +53,7 @@
             ExecutionException ee = assertIsInstanceOf(ExecutionException.class, e.getCause());
             CamelExchangeException cause = assertIsInstanceOf(CamelExchangeException.class, ee.getCause());
             assertTrue(cause.getMessage().startsWith("Parallel processing failed for number "));
-            assertTrue(cause.getMessage().contains("on the exchange: Exchange[Message: Kaboom]"));
+            assertTrue(cause.getMessage().contains("Exchange[Message: Kaboom]"));
             assertEquals("Forced", cause.getCause().getMessage());
         }
 

Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/processor/SplitterStopOnExceptionTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/SplitterStopOnExceptionTest.java?rev=891253&r1=891252&r2=891253&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/processor/SplitterStopOnExceptionTest.java (original)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/processor/SplitterStopOnExceptionTest.java Wed Dec 16 14:38:44 2009
@@ -48,7 +48,7 @@
             fail("Should thrown an exception");
         } catch (CamelExecutionException e) {
             CamelExchangeException cause = assertIsInstanceOf(CamelExchangeException.class, e.getCause());
-            assertTrue(cause.getMessage().startsWith("Sequential processing failed for number 1 on the exchange: Exchange[Message: Kaboom]"));
+            assertTrue(cause.getMessage().startsWith("Sequential processing failed for number 1. Exchange[Message: Kaboom]"));
             assertEquals("Forced", cause.getCause().getMessage());
         }
 

Modified: camel/trunk/components/camel-quartz/src/main/java/org/apache/camel/component/quartz/QuartzEndpoint.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-quartz/src/main/java/org/apache/camel/component/quartz/QuartzEndpoint.java?rev=891253&r1=891252&r2=891253&view=diff
==============================================================================
--- camel/trunk/components/camel-quartz/src/main/java/org/apache/camel/component/quartz/QuartzEndpoint.java (original)
+++ camel/trunk/components/camel-quartz/src/main/java/org/apache/camel/component/quartz/QuartzEndpoint.java Wed Dec 16 14:38:44 2009
@@ -24,6 +24,7 @@
 import org.apache.camel.impl.DefaultEndpoint;
 import org.apache.camel.processor.loadbalancer.LoadBalancer;
 import org.apache.camel.processor.loadbalancer.RoundRobinLoadBalancer;
+import org.apache.camel.util.ExchangeHelper;
 import org.apache.camel.util.ObjectHelper;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -102,13 +103,18 @@
         try {
             getLoadBalancer().process(exchange);
 
-            // log exception if an exception occurred and was not handled
             if (exchange.getException() != null) {
-                LOG.error("Quart Job processing Exchange: " + exchange + " failed with exception.", exchange.getException());
+                // propagate the exception back to Quartz
+                throw new JobExecutionException(exchange.getException());
             }
-        } catch (JobExecutionException e) {
-            throw e;
         } catch (Exception e) {
+            // log the error
+            LOG.error(ExchangeHelper.createExceptionMessage("Error processing exchange", exchange, e));
+
+            // and rethrow to let quartz handle it
+            if (e instanceof JobExecutionException) {
+                throw (JobExecutionException) e;
+            }
             throw new JobExecutionException(e);
         }
     }