CAMEL-5452: DoCatch now also emits the failure handled event
Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/e2183378 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/e2183378 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/e2183378 Branch: refs/heads/master Commit: e2183378b12c13707600816339442737778b364e Parents: f078028 Author: Claus Ibsen <davscl...@apache.org> Authored: Wed Mar 25 10:24:08 2015 +0100 Committer: Claus Ibsen <davscl...@apache.org> Committed: Wed Mar 25 11:25:10 2015 +0100 ---------------------------------------------------------------------- .../event/ExchangeFailureHandledEvent.java | 2 + .../apache/camel/processor/CatchProcessor.java | 7 ++- .../java/org/apache/camel/spi/EventFactory.java | 2 +- .../EventNotifierFailureHandledEventsTest.java | 45 ++++++++++++++++++++ 4 files changed, 54 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/e2183378/camel-core/src/main/java/org/apache/camel/management/event/ExchangeFailureHandledEvent.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/management/event/ExchangeFailureHandledEvent.java b/camel-core/src/main/java/org/apache/camel/management/event/ExchangeFailureHandledEvent.java index 2c0dd7d..4aeae2c 100644 --- a/camel-core/src/main/java/org/apache/camel/management/event/ExchangeFailureHandledEvent.java +++ b/camel-core/src/main/java/org/apache/camel/management/event/ExchangeFailureHandledEvent.java @@ -55,6 +55,8 @@ public class ExchangeFailureHandledEvent extends AbstractExchangeEvent { return handled; } + public boolean isContinued() { return !handled; } + @Override public String toString() { if (isDeadLetterChannel()) { http://git-wip-us.apache.org/repos/asf/camel/blob/e2183378/camel-core/src/main/java/org/apache/camel/processor/CatchProcessor.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/processor/CatchProcessor.java b/camel-core/src/main/java/org/apache/camel/processor/CatchProcessor.java index 063a776..f30954d 100644 --- a/camel-core/src/main/java/org/apache/camel/processor/CatchProcessor.java +++ b/camel-core/src/main/java/org/apache/camel/processor/CatchProcessor.java @@ -24,6 +24,7 @@ import org.apache.camel.Predicate; import org.apache.camel.Processor; import org.apache.camel.Traceable; import org.apache.camel.spi.IdAware; +import org.apache.camel.util.EventHelper; import org.apache.camel.util.ExchangeHelper; import org.apache.camel.util.ObjectHelper; import org.slf4j.Logger; @@ -100,7 +101,11 @@ public class CatchProcessor extends DelegateAsyncProcessor implements Traceable, boolean sync = processor.process(exchange, new AsyncCallback() { public void done(boolean doneSync) { - if (!handled) { + if (handled) { + ExchangeHelper.setFailureHandled(exchange); + // emit event that the failure was handled + EventHelper.notifyExchangeFailureHandled(exchange.getContext(), exchange, processor, false, null); + } else { if (exchange.getException() == null) { exchange.setException(exchange.getProperty(Exchange.EXCEPTION_CAUGHT, Exception.class)); } http://git-wip-us.apache.org/repos/asf/camel/blob/e2183378/camel-core/src/main/java/org/apache/camel/spi/EventFactory.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/spi/EventFactory.java b/camel-core/src/main/java/org/apache/camel/spi/EventFactory.java index 25c9578..e42d178 100644 --- a/camel-core/src/main/java/org/apache/camel/spi/EventFactory.java +++ b/camel-core/src/main/java/org/apache/camel/spi/EventFactory.java @@ -161,7 +161,7 @@ public interface EventFactory { /** * Creates an {@link EventObject} when an {@link org.apache.camel.Exchange} has failed - * but was handled by the Camel error handlers such as an dead letter channel. + * but was handled by the Camel error handlers such as an dead letter channel, or a doTry .. doCatch block. * * @param exchange the exchange * @param failureHandler the failure handler such as moving the message to a dead letter queue http://git-wip-us.apache.org/repos/asf/camel/blob/e2183378/camel-core/src/test/java/org/apache/camel/management/EventNotifierFailureHandledEventsTest.java ---------------------------------------------------------------------- diff --git a/camel-core/src/test/java/org/apache/camel/management/EventNotifierFailureHandledEventsTest.java b/camel-core/src/test/java/org/apache/camel/management/EventNotifierFailureHandledEventsTest.java index f7db679..0b2e313 100644 --- a/camel-core/src/test/java/org/apache/camel/management/EventNotifierFailureHandledEventsTest.java +++ b/camel-core/src/test/java/org/apache/camel/management/EventNotifierFailureHandledEventsTest.java @@ -104,6 +104,8 @@ public class EventNotifierFailureHandledEventsTest extends ContextTestSupport { ExchangeFailureHandledEvent e = assertIsInstanceOf(ExchangeFailureHandledEvent.class, events.get(8)); assertEquals("should be DLC", true, e.isDeadLetterChannel()); + assertTrue("should be marked as failure handled", e.isHandled()); + assertFalse("should not be continued", e.isContinued()); SendProcessor send = assertIsInstanceOf(SendProcessor.class, e.getFailureHandler()); assertEquals("mock://dead", send.getDestination().getEndpointUri()); assertEquals("mock://dead", e.getDeadLetterUri()); @@ -143,6 +145,49 @@ public class EventNotifierFailureHandledEventsTest extends ContextTestSupport { ExchangeFailureHandledEvent e = assertIsInstanceOf(ExchangeFailureHandledEvent.class, events.get(8)); assertEquals("should NOT be DLC", false, e.isDeadLetterChannel()); + assertTrue("should be marked as failure handled", e.isHandled()); + assertFalse("should not be continued", e.isContinued()); + + // onException will handle the exception + assertIsInstanceOf(ExchangeCompletedEvent.class, events.get(9)); + // and the last event should be the direct:start + assertIsInstanceOf(ExchangeSentEvent.class, events.get(10)); + ExchangeSentEvent sent = (ExchangeSentEvent) events.get(10); + assertEquals("direct://start", sent.getEndpoint().getEndpointUri()); + } + + public void testExchangeDoTryDoCatch() throws Exception { + context.addRoutes(new RouteBuilder() { + @Override + public void configure() throws Exception { + from("direct:start") + .doTry() + .throwException(new IllegalArgumentException("Damn")) + .doCatch(IllegalArgumentException.class) + .to("mock:dead") + .end(); + } + }); + context.start(); + + getMockEndpoint("mock:dead").expectedMessageCount(1); + template.sendBody("direct:start", "Hello World"); + assertMockEndpointsSatisfied(); + + assertEquals(11, events.size()); + assertIsInstanceOf(CamelContextStartingEvent.class, events.get(0)); + assertIsInstanceOf(RouteAddedEvent.class, events.get(1)); + assertIsInstanceOf(RouteStartedEvent.class, events.get(2)); + assertIsInstanceOf(CamelContextStartedEvent.class, events.get(3)); + assertIsInstanceOf(ExchangeSendingEvent.class, events.get(4)); + assertIsInstanceOf(ExchangeCreatedEvent.class, events.get(5)); + assertIsInstanceOf(ExchangeSendingEvent.class, events.get(6)); + assertIsInstanceOf(ExchangeSentEvent.class, events.get(7)); + + ExchangeFailureHandledEvent e = assertIsInstanceOf(ExchangeFailureHandledEvent.class, events.get(8)); + assertEquals("should NOT be DLC", false, e.isDeadLetterChannel()); + assertFalse("should not be marked as failure handled as it was continued instead", e.isHandled()); + assertTrue("should be continued", e.isContinued()); // onException will handle the exception assertIsInstanceOf(ExchangeCompletedEvent.class, events.get(9));