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