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 2010/07/09 14:06:56 UTC

svn commit: r962496 - in /camel/trunk/camel-core/src: main/java/org/apache/camel/builder/ main/java/org/apache/camel/management/ main/java/org/apache/camel/management/event/ main/java/org/apache/camel/management/mbean/ main/java/org/apache/camel/proces...

Author: davsclaus
Date: Fri Jul  9 12:06:55 2010
New Revision: 962496

URL: http://svn.apache.org/viewvc?rev=962496&view=rev
Log:
CAMEL-2932: Added event for redelivery attempt. Renamed ExchangeFailureEvent to ExchangeFailedEvent which is a better name.

Added:
    camel/trunk/camel-core/src/main/java/org/apache/camel/management/event/ExchangeFailedEvent.java   (contents, props changed)
      - copied, changed from r962466, camel/trunk/camel-core/src/main/java/org/apache/camel/management/event/ExchangeFailureEvent.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/management/event/ExchangeRedeliveryEvent.java
      - copied, changed from r962466, camel/trunk/camel-core/src/main/java/org/apache/camel/management/event/ExchangeSentEvent.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/management/EventNotifierRedeliveryEventsTest.java
      - copied, changed from r962466, camel/trunk/camel-core/src/test/java/org/apache/camel/management/EventNotifierFailureHandledEventsTest.java
Removed:
    camel/trunk/camel-core/src/main/java/org/apache/camel/management/event/ExchangeFailureEvent.java
Modified:
    camel/trunk/camel-core/src/main/java/org/apache/camel/builder/NotifyBuilder.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/management/DefaultEventFactory.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/management/EventNotifierSupport.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedEventNotifier.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedEventNotifierMBean.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/EventFactory.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/spi/EventNotifier.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/util/EventHelper.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/management/EventNotifierEventsTest.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/management/EventNotifierExchangeSentTest.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/management/MultipleEventNotifierEventsTest.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/processor/interceptor/DebugExceptionEventBreakpointTest.java

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/builder/NotifyBuilder.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/NotifyBuilder.java?rev=962496&r1=962495&r2=962496&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/builder/NotifyBuilder.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/builder/NotifyBuilder.java Fri Jul  9 12:06:55 2010
@@ -35,7 +35,7 @@ import org.apache.camel.component.mock.M
 import org.apache.camel.management.EventNotifierSupport;
 import org.apache.camel.management.event.ExchangeCompletedEvent;
 import org.apache.camel.management.event.ExchangeCreatedEvent;
-import org.apache.camel.management.event.ExchangeFailureEvent;
+import org.apache.camel.management.event.ExchangeFailedEvent;
 import org.apache.camel.spi.EventNotifier;
 import org.apache.camel.util.EndpointHelper;
 import org.apache.camel.util.ObjectHelper;
@@ -288,7 +288,7 @@ public class NotifyBuilder {
             }
 
             @Override
-            public boolean onExchangeFailure(Exchange exchange) {
+            public boolean onExchangeFailed(Exchange exchange) {
                 current++;
                 return true;
             }
@@ -363,7 +363,7 @@ public class NotifyBuilder {
             private int current;
 
             @Override
-            public boolean onExchangeFailure(Exchange exchange) {
+            public boolean onExchangeFailed(Exchange exchange) {
                 current++;
                 return true;
             }
@@ -404,7 +404,7 @@ public class NotifyBuilder {
             }
 
             @Override
-            public boolean onExchangeFailure(Exchange exchange) {
+            public boolean onExchangeFailed(Exchange exchange) {
                 current++;
                 return true;
             }
@@ -473,7 +473,7 @@ public class NotifyBuilder {
             private int current;
 
             @Override
-            public boolean onExchangeFailure(Exchange exchange) {
+            public boolean onExchangeFailed(Exchange exchange) {
                 current++;
                 return true;
             }
@@ -528,7 +528,7 @@ public class NotifyBuilder {
             }
 
             @Override
-            public boolean onExchangeFailure(Exchange exchange) {
+            public boolean onExchangeFailed(Exchange exchange) {
                 if (!received && !matches) {
                     matches = predicate.matches(exchange);
                 }
@@ -597,7 +597,7 @@ public class NotifyBuilder {
             }
 
             @Override
-            public boolean onExchangeFailure(Exchange exchange) {
+            public boolean onExchangeFailed(Exchange exchange) {
                 if (!received && matches) {
                     matches = predicate.matches(exchange);
                 }
@@ -680,7 +680,7 @@ public class NotifyBuilder {
             }
 
             @Override
-            public boolean onExchangeFailure(Exchange exchange) {
+            public boolean onExchangeFailed(Exchange exchange) {
                 if (!received) {
                     sendToMock(exchange);
                 }
@@ -780,7 +780,7 @@ public class NotifyBuilder {
             }
 
             @Override
-            public boolean onExchangeFailure(Exchange exchange) {
+            public boolean onExchangeFailed(Exchange exchange) {
                 if (!received) {
                     sendToMock(exchange);
                 }
@@ -908,7 +908,7 @@ public class NotifyBuilder {
             }
 
             @Override
-            public boolean onExchangeFailure(Exchange exchange) {
+            public boolean onExchangeFailed(Exchange exchange) {
                 if (!received) {
                     matchBody(exchange);
                 }
@@ -1086,8 +1086,8 @@ public class NotifyBuilder {
                 onExchangeCreated((ExchangeCreatedEvent) event);
             } else if (event instanceof ExchangeCompletedEvent) {
                 onExchangeCompleted((ExchangeCompletedEvent) event);
-            } else if (event instanceof ExchangeFailureEvent) {
-                onExchangeFailure((ExchangeFailureEvent) event);
+            } else if (event instanceof ExchangeFailedEvent) {
+                onExchangeFailed((ExchangeFailedEvent) event);
             }
 
             // now compute whether we matched
@@ -1110,9 +1110,9 @@ public class NotifyBuilder {
             }
         }
 
-        private void onExchangeFailure(ExchangeFailureEvent event) {
+        private void onExchangeFailed(ExchangeFailedEvent event) {
             for (EventPredicateHolder predicate : predicates) {
-                predicate.getPredicate().onExchangeFailure(event.getExchange());
+                predicate.getPredicate().onExchangeFailed(event.getExchange());
             }
         }
 
@@ -1208,7 +1208,7 @@ public class NotifyBuilder {
          * @param exchange the exchange
          * @return <tt>true</tt> to allow continue evaluating, <tt>false</tt> to stop immediately
          */
-        boolean onExchangeFailure(Exchange exchange);
+        boolean onExchangeFailed(Exchange exchange);
     }
 
     private abstract class EventPredicateSupport implements EventPredicate {
@@ -1225,7 +1225,7 @@ public class NotifyBuilder {
             return onExchange(exchange);
         }
 
-        public boolean onExchangeFailure(Exchange exchange) {
+        public boolean onExchangeFailed(Exchange exchange) {
             return onExchange(exchange);
         }
 
@@ -1308,9 +1308,9 @@ public class NotifyBuilder {
             return true;
         }
 
-        public boolean onExchangeFailure(Exchange exchange) {
+        public boolean onExchangeFailed(Exchange exchange) {
             for (EventPredicate predicate : predicates) {
-                if (!predicate.onExchangeFailure(exchange)) {
+                if (!predicate.onExchangeFailed(exchange)) {
                     return false;
                 }
             }

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/management/DefaultEventFactory.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/management/DefaultEventFactory.java?rev=962496&r1=962495&r2=962496&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/management/DefaultEventFactory.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/management/DefaultEventFactory.java Fri Jul  9 12:06:55 2010
@@ -31,8 +31,9 @@ import org.apache.camel.management.event
 import org.apache.camel.management.event.CamelContextStoppingEvent;
 import org.apache.camel.management.event.ExchangeCompletedEvent;
 import org.apache.camel.management.event.ExchangeCreatedEvent;
-import org.apache.camel.management.event.ExchangeFailureEvent;
+import org.apache.camel.management.event.ExchangeFailedEvent;
 import org.apache.camel.management.event.ExchangeFailureHandledEvent;
+import org.apache.camel.management.event.ExchangeRedeliveryEvent;
 import org.apache.camel.management.event.ExchangeSentEvent;
 import org.apache.camel.management.event.RouteStartedEvent;
 import org.apache.camel.management.event.RouteStoppedEvent;
@@ -95,14 +96,18 @@ public class DefaultEventFactory impleme
         return new ExchangeCompletedEvent(exchange);
     }
 
-    public EventObject createExchangeFailureEvent(Exchange exchange) {
-        return new ExchangeFailureEvent(exchange);
+    public EventObject createExchangeFailedEvent(Exchange exchange) {
+        return new ExchangeFailedEvent(exchange);
     }
 
     public EventObject createExchangeFailureHandledEvent(Exchange exchange, Processor failureHandler, boolean deadLetterChannel) {
         return new ExchangeFailureHandledEvent(exchange, failureHandler, deadLetterChannel);
     }
 
+    public EventObject createExchangeRedeliveryEvent(Exchange exchange, int attempt) {
+        return new ExchangeRedeliveryEvent(exchange, attempt);
+    }
+
     public EventObject createExchangeSentEvent(Exchange exchange, Endpoint endpoint, long timeTaken) {
         return new ExchangeSentEvent(exchange, endpoint, timeTaken);
     }

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/management/EventNotifierSupport.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/management/EventNotifierSupport.java?rev=962496&r1=962495&r2=962496&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/management/EventNotifierSupport.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/management/EventNotifierSupport.java Fri Jul  9 12:06:55 2010
@@ -34,7 +34,8 @@ public abstract class EventNotifierSuppo
     private boolean ignoreExchangeEvents;
     private boolean ignoreExchangeCreatedEvent;
     private boolean ignoreExchangeCompletedEvent;
-    private boolean ignoreExchangeFailureEvents;
+    private boolean ignoreExchangeFailedEvents;
+    private boolean ignoreExchangeRedeliveryEvents;
     private boolean ignoreExchangeSentEvents;
 
     public boolean isIgnoreCamelContextEvents() {
@@ -85,12 +86,20 @@ public abstract class EventNotifierSuppo
         this.ignoreExchangeCompletedEvent = ignoreExchangeCompletedEvent;
     }
 
-    public boolean isIgnoreExchangeFailureEvents() {
-        return ignoreExchangeFailureEvents;
+    public boolean isIgnoreExchangeFailedEvents() {
+        return ignoreExchangeFailedEvents;
     }
 
-    public void setIgnoreExchangeFailureEvents(boolean ignoreExchangeFailureEvents) {
-        this.ignoreExchangeFailureEvents = ignoreExchangeFailureEvents;
+    public void setIgnoreExchangeFailedEvents(boolean ignoreExchangeFailedEvents) {
+        this.ignoreExchangeFailedEvents = ignoreExchangeFailedEvents;
+    }
+
+    public boolean isIgnoreExchangeRedeliveryEvents() {
+        return ignoreExchangeRedeliveryEvents;
+    }
+
+    public void setIgnoreExchangeRedeliveryEvents(boolean ignoreExchangeRedeliveryEvents) {
+        this.ignoreExchangeRedeliveryEvents = ignoreExchangeRedeliveryEvents;
     }
 
     public boolean isIgnoreExchangeSentEvents() {

Copied: camel/trunk/camel-core/src/main/java/org/apache/camel/management/event/ExchangeFailedEvent.java (from r962466, camel/trunk/camel-core/src/main/java/org/apache/camel/management/event/ExchangeFailureEvent.java)
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/management/event/ExchangeFailedEvent.java?p2=camel/trunk/camel-core/src/main/java/org/apache/camel/management/event/ExchangeFailedEvent.java&p1=camel/trunk/camel-core/src/main/java/org/apache/camel/management/event/ExchangeFailureEvent.java&r1=962466&r2=962496&rev=962496&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/management/event/ExchangeFailureEvent.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/management/event/ExchangeFailedEvent.java Fri Jul  9 12:06:55 2010
@@ -21,10 +21,10 @@ import org.apache.camel.Exchange;
 /**
  * @version $Revision$
  */
-public class ExchangeFailureEvent extends AbstractExchangeEvent {
+public class ExchangeFailedEvent extends AbstractExchangeEvent {
     private static final long serialVersionUID = -8484326904627268101L;
 
-    public ExchangeFailureEvent(Exchange source) {
+    public ExchangeFailedEvent(Exchange source) {
         super(source);
     }
 

Propchange: camel/trunk/camel-core/src/main/java/org/apache/camel/management/event/ExchangeFailedEvent.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: camel/trunk/camel-core/src/main/java/org/apache/camel/management/event/ExchangeFailedEvent.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Copied: camel/trunk/camel-core/src/main/java/org/apache/camel/management/event/ExchangeRedeliveryEvent.java (from r962466, camel/trunk/camel-core/src/main/java/org/apache/camel/management/event/ExchangeSentEvent.java)
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/management/event/ExchangeRedeliveryEvent.java?p2=camel/trunk/camel-core/src/main/java/org/apache/camel/management/event/ExchangeRedeliveryEvent.java&p1=camel/trunk/camel-core/src/main/java/org/apache/camel/management/event/ExchangeSentEvent.java&r1=962466&r2=962496&rev=962496&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/management/event/ExchangeSentEvent.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/management/event/ExchangeRedeliveryEvent.java Fri Jul  9 12:06:55 2010
@@ -16,35 +16,33 @@
  */
 package org.apache.camel.management.event;
 
-import org.apache.camel.Endpoint;
 import org.apache.camel.Exchange;
 
 /**
  * @version $Revision$
  */
-public class ExchangeSentEvent extends AbstractExchangeEvent {
-    private static final long serialVersionUID = -19248832613958123L;
+public class ExchangeRedeliveryEvent extends AbstractExchangeEvent {
+    private static final long serialVersionUID = -19248832613958122L;
 
-    private final Endpoint endpoint;
-    private final long timeTaken;
+    private final int attempt;
 
-    public ExchangeSentEvent(Exchange source, Endpoint endpoint, long timeTaken) {
+    public ExchangeRedeliveryEvent(Exchange source, int attempt) {
         super(source);
-        this.endpoint = endpoint;
-        this.timeTaken = timeTaken;
+        this.attempt = attempt;
     }
 
-    public Endpoint getEndpoint() {
-        return endpoint;
-    }
-
-    public long getTimeTaken() {
-        return timeTaken;
+    public int getAttempt() {
+        return attempt;
     }
 
     @Override
     public String toString() {
-        return getExchange().getExchangeId() + " exchange " + getExchange() + " sent to: " + endpoint.getEndpointUri() + " took: " + timeTaken + " ms.";
+        Exception cause = getExchange().getProperty(Exchange.EXCEPTION_CAUGHT, Exception.class);
+        if (cause != null) {
+            return getExchange().getExchangeId() + " exchange redelivery: " + getExchange() + " attempt " + attempt + " cause " + cause;
+        } else {
+            return getExchange().getExchangeId() + " exchange redelivery: " + getExchange() + " attempt " + attempt;
+        }
     }
 
 }
\ No newline at end of file

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedEventNotifier.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedEventNotifier.java?rev=962496&r1=962495&r2=962496&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedEventNotifier.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedEventNotifier.java Fri Jul  9 12:06:55 2010
@@ -18,7 +18,6 @@ package org.apache.camel.management.mbea
 
 import java.util.ArrayList;
 import java.util.List;
-
 import javax.management.MBeanNotificationInfo;
 import javax.management.NotificationBroadcasterSupport;
 
@@ -103,12 +102,20 @@ public class ManagedEventNotifier extend
         getEventNotifier().setIgnoreExchangeCompletedEvent(ignoreExchangeCompletedEvent);
     }
     
-    public boolean isIgnoreExchangeFailureEvents() {
-        return getEventNotifier().isIgnoreExchangeFailureEvents();
+    public boolean isIgnoreExchangeFailedEvents() {
+        return getEventNotifier().isIgnoreExchangeFailedEvents();
     }
     
-    public void setIgnoreExchangeFailureEvents(boolean ignoreExchangeFailureEvents) {
-        getEventNotifier().setIgnoreExchangeFailureEvents(ignoreExchangeFailureEvents);
+    public void setIgnoreExchangeFailedEvents(boolean ignoreExchangeFailedEvents) {
+        getEventNotifier().setIgnoreExchangeFailedEvents(ignoreExchangeFailedEvents);
+    }
+
+    public boolean isIgnoreExchangeRedeliveryEvents() {
+        return getEventNotifier().isIgnoreExchangeRedeliveryEvents();
+    }
+
+    public void setIgnoreExchangeRedeliveryEvents(boolean ignoreExchangeRedeliveryEvents) {
+        getEventNotifier().setIgnoreExchangeRedeliveryEvents(ignoreExchangeRedeliveryEvents);
     }
 
     public boolean isIgnoreExchangeSentEvents() {
@@ -123,8 +130,8 @@ public class ManagedEventNotifier extend
         // all the class names in the event package
         String[] names = {"CamelContextStartedEvent", "CamelContextStartingEvent", "CamelContextStartupFailureEvent"
                 , "CamelContextStopFailureEvent", "CamelContextStoppedEvent", "CamelContextStoppingEvent"
-                , "ExchangeCompletedEvent", "ExchangeCreatedEvent", "ExchangeFailureEvent"
-                , "ExchangeFailureHandledEvent", "ExchangeSentEvent", "RouteStartedEvent"
+                , "ExchangeCompletedEvent", "ExchangeCreatedEvent", "ExchangeFailedEvent"
+                , "ExchangeFailureHandledEvent", "ExchangeRedeliveryEvents", "ExchangeSentEvent", "RouteStartedEvent"
                 , "RouteStoppedEvent", "ServiceStartupFailureEvent", "ServiceStopFailureEvent"};
 
         List<MBeanNotificationInfo> infos = new ArrayList<MBeanNotificationInfo>();

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedEventNotifierMBean.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedEventNotifierMBean.java?rev=962496&r1=962495&r2=962496&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedEventNotifierMBean.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedEventNotifierMBean.java Fri Jul  9 12:06:55 2010
@@ -42,9 +42,13 @@ public interface ManagedEventNotifierMBe
 
     void setIgnoreExchangeCompletedEvent(boolean ignoreExchangeCompletedEvent);
 
-    boolean isIgnoreExchangeFailureEvents();
+    boolean isIgnoreExchangeFailedEvents();
 
-    void setIgnoreExchangeFailureEvents(boolean ignoreExchangeFailureEvents);
+    void setIgnoreExchangeFailedEvents(boolean ignoreExchangeFailedEvents);
+
+    boolean isIgnoreExchangeRedeliveryEvents();
+
+    void setIgnoreExchangeRedeliveryEvents(boolean ignoreExchangeRedeliveryEvents);
 
     boolean isIgnoreExchangeSentEvents();
 

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=962496&r1=962495&r2=962496&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 Fri Jul  9 12:06:55 2010
@@ -109,6 +109,9 @@ public abstract class RedeliveryErrorHan
                 log.trace("Redelivering exchangeId: " + exchange.getExchangeId() + " -> " + outputAsync + " for Exchange: " + exchange);
             }
 
+            // emmit event we are doing redelivery
+            EventHelper.notifyExchangeRedelivery(exchange.getContext(), exchange, data.redeliveryCounter);
+
             // process the exchange (also redelivery)
             boolean sync;
             if (data.redeliverFromSync) {
@@ -278,6 +281,9 @@ public abstract class RedeliveryErrorHan
 
                 // letting onRedeliver be executed
                 deliverToOnRedeliveryProcessor(exchange, data);
+
+                // emmit event we are doing redelivery
+                EventHelper.notifyExchangeRedelivery(exchange.getContext(), exchange, data.redeliveryCounter);
             }
 
             // process the exchange (also redelivery)

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/spi/EventFactory.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/spi/EventFactory.java?rev=962496&r1=962495&r2=962496&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/spi/EventFactory.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/spi/EventFactory.java Fri Jul  9 12:06:55 2010
@@ -53,7 +53,7 @@ public interface EventFactory {
      * Creates an {@link EventObject} for Camel failing to start
      *
      * @param context camel context
-     * @param cause the cause exception
+     * @param cause   the cause exception
      * @return the created event
      */
     EventObject createCamelContextStartupFailureEvent(CamelContext context, Throwable cause);
@@ -62,7 +62,7 @@ public interface EventFactory {
      * Creates an {@link EventObject} for Camel failing to stop cleanly
      *
      * @param context camel context
-     * @param cause the cause exception
+     * @param cause   the cause exception
      * @return the created event
      */
     EventObject createCamelContextStopFailureEvent(CamelContext context, Throwable cause);
@@ -88,7 +88,7 @@ public interface EventFactory {
      *
      * @param context camel context
      * @param service the service
-     * @param cause the cause exception
+     * @param cause   the cause exception
      * @return the created event
      */
     EventObject createServiceStartupFailureEvent(CamelContext context, Object service, Throwable cause);
@@ -98,7 +98,7 @@ public interface EventFactory {
      *
      * @param context camel context
      * @param service the service
-     * @param cause the cause exception
+     * @param cause   the cause exception
      * @return the created event
      */
     EventObject createServiceStopFailureEvent(CamelContext context, Object service, Throwable cause);
@@ -141,24 +141,33 @@ public interface EventFactory {
      * @param exchange the exchange
      * @return the created event
      */
-    EventObject createExchangeFailureEvent(Exchange exchange);
+    EventObject createExchangeFailedEvent(Exchange exchange);
 
     /**
      * 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.
      *
-     * @param exchange the exchange
-     * @param failureHandler the failure handler such as moving the message to a dead letter queue
+     * @param exchange          the exchange
+     * @param failureHandler    the failure handler such as moving the message to a dead letter queue
      * @param deadLetterChannel whether it was a dead letter channel or not handling the failure
      * @return the created event
      */
     EventObject createExchangeFailureHandledEvent(Exchange exchange, Processor failureHandler, boolean deadLetterChannel);
 
     /**
-     * Creates an {@link EventObject} when an {@link org.apache.camel.Exchange} has been sent to the endpoint.
+     * Creates an {@link EventObject} when an {@link org.apache.camel.Exchange} is about to be redelivered
      *
      * @param exchange the exchange
-     * @param endpoint the destination
+     * @param attempt  the current redelivery attempt (starts from 1)
+     * @return the created event
+     */
+    EventObject createExchangeRedeliveryEvent(Exchange exchange, int attempt);
+
+    /**
+     * Creates an {@link EventObject} when an {@link org.apache.camel.Exchange} has completely been sent to the endpoint.
+     *
+     * @param exchange  the exchange
+     * @param endpoint  the destination
      * @param timeTaken time in millis taken
      * @return the created event
      */

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/spi/EventNotifier.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/spi/EventNotifier.java?rev=962496&r1=962495&r2=962496&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/spi/EventNotifier.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/spi/EventNotifier.java Fri Jul  9 12:06:55 2010
@@ -68,9 +68,13 @@ public interface EventNotifier {
 
     void setIgnoreExchangeCompletedEvent(boolean ignoreExchangeCompletedEvent);
 
-    boolean isIgnoreExchangeFailureEvents();
+    boolean isIgnoreExchangeFailedEvents();
 
-    void setIgnoreExchangeFailureEvents(boolean ignoreExchangeFailureEvents);
+    void setIgnoreExchangeFailedEvents(boolean ignoreExchangeFailureEvents);
+
+    boolean isIgnoreExchangeRedeliveryEvents();
+
+    void setIgnoreExchangeRedeliveryEvents(boolean ignoreExchangeRedeliveryEvents);
 
     boolean isIgnoreExchangeSentEvents();
 

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/util/EventHelper.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/util/EventHelper.java?rev=962496&r1=962495&r2=962496&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/util/EventHelper.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/util/EventHelper.java Fri Jul  9 12:06:55 2010
@@ -325,7 +325,7 @@ public final class EventHelper {
         }
 
         for (EventNotifier notifier : notifiers) {
-            if (notifier.isIgnoreExchangeEvents() || notifier.isIgnoreExchangeFailureEvents()) {
+            if (notifier.isIgnoreExchangeEvents() || notifier.isIgnoreExchangeFailedEvents()) {
                 continue;
             }
 
@@ -333,7 +333,7 @@ public final class EventHelper {
             if (factory == null) {
                 return;
             }
-            EventObject event = factory.createExchangeFailureEvent(exchange);
+            EventObject event = factory.createExchangeFailedEvent(exchange);
             if (event == null) {
                 return;
             }
@@ -349,7 +349,7 @@ public final class EventHelper {
         }
 
         for (EventNotifier notifier : notifiers) {
-            if (notifier.isIgnoreExchangeEvents() || notifier.isIgnoreExchangeFailureEvents()) {
+            if (notifier.isIgnoreExchangeEvents() || notifier.isIgnoreExchangeFailedEvents()) {
                 continue;
             }
 
@@ -365,6 +365,29 @@ public final class EventHelper {
         }
     }
 
+    public static void notifyExchangeRedelivery(CamelContext context, Exchange exchange, int attempt) {
+        List<EventNotifier> notifiers = context.getManagementStrategy().getEventNotifiers();
+        if (notifiers == null || notifiers.isEmpty()) {
+            return;
+        }
+
+        for (EventNotifier notifier : notifiers) {
+            if (notifier.isIgnoreExchangeEvents() || notifier.isIgnoreExchangeFailedEvents()) {
+                continue;
+            }
+
+            EventFactory factory = context.getManagementStrategy().getEventFactory();
+            if (factory == null) {
+                return;
+            }
+            EventObject event = factory.createExchangeRedeliveryEvent(exchange, attempt);
+            if (event == null) {
+                return;
+            }
+            doNotifyEvent(notifier, event);
+        }
+    }
+
     public static void notifyExchangeSent(CamelContext context, Exchange exchange, Endpoint endpoint, long timeTaken) {
         List<EventNotifier> notifiers = context.getManagementStrategy().getEventNotifiers();
         if (notifiers == null || notifiers.isEmpty()) {

Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/management/EventNotifierEventsTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/management/EventNotifierEventsTest.java?rev=962496&r1=962495&r2=962496&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/management/EventNotifierEventsTest.java (original)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/management/EventNotifierEventsTest.java Fri Jul  9 12:06:55 2010
@@ -30,7 +30,7 @@ import org.apache.camel.management.event
 import org.apache.camel.management.event.CamelContextStoppingEvent;
 import org.apache.camel.management.event.ExchangeCompletedEvent;
 import org.apache.camel.management.event.ExchangeCreatedEvent;
-import org.apache.camel.management.event.ExchangeFailureEvent;
+import org.apache.camel.management.event.ExchangeFailedEvent;
 import org.apache.camel.management.event.ExchangeSentEvent;
 import org.apache.camel.management.event.RouteStartedEvent;
 import org.apache.camel.management.event.RouteStoppedEvent;
@@ -120,7 +120,7 @@ public class EventNotifierEventsTest ext
         assertIsInstanceOf(RouteStartedEvent.class, events.get(2));
         assertIsInstanceOf(CamelContextStartedEvent.class, events.get(3));
         assertIsInstanceOf(ExchangeCreatedEvent.class, events.get(4));
-        assertIsInstanceOf(ExchangeFailureEvent.class, events.get(5));
+        assertIsInstanceOf(ExchangeFailedEvent.class, events.get(5));
         // this is the sent using the produce template to start the test
         assertIsInstanceOf(ExchangeSentEvent.class, events.get(6));
 

Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/management/EventNotifierExchangeSentTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/management/EventNotifierExchangeSentTest.java?rev=962496&r1=962495&r2=962496&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/management/EventNotifierExchangeSentTest.java (original)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/management/EventNotifierExchangeSentTest.java Fri Jul  9 12:06:55 2010
@@ -64,7 +64,8 @@ public class EventNotifierExchangeSentTe
                 setIgnoreRouteEvents(true);
                 setIgnoreExchangeCreatedEvent(true);
                 setIgnoreExchangeCompletedEvent(true);
-                setIgnoreExchangeFailureEvents(true);
+                setIgnoreExchangeFailedEvents(true);
+                setIgnoreExchangeRedeliveryEvents(true);
             }
 
             @Override

Copied: camel/trunk/camel-core/src/test/java/org/apache/camel/management/EventNotifierRedeliveryEventsTest.java (from r962466, camel/trunk/camel-core/src/test/java/org/apache/camel/management/EventNotifierFailureHandledEventsTest.java)
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/management/EventNotifierRedeliveryEventsTest.java?p2=camel/trunk/camel-core/src/test/java/org/apache/camel/management/EventNotifierRedeliveryEventsTest.java&p1=camel/trunk/camel-core/src/test/java/org/apache/camel/management/EventNotifierFailureHandledEventsTest.java&r1=962466&r2=962496&rev=962496&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/management/EventNotifierFailureHandledEventsTest.java (original)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/management/EventNotifierRedeliveryEventsTest.java Fri Jul  9 12:06:55 2010
@@ -24,19 +24,16 @@ import org.apache.camel.CamelContext;
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.impl.DefaultCamelContext;
-import org.apache.camel.management.event.CamelContextStartedEvent;
-import org.apache.camel.management.event.CamelContextStartingEvent;
 import org.apache.camel.management.event.ExchangeCompletedEvent;
 import org.apache.camel.management.event.ExchangeCreatedEvent;
 import org.apache.camel.management.event.ExchangeFailureHandledEvent;
+import org.apache.camel.management.event.ExchangeRedeliveryEvent;
 import org.apache.camel.management.event.ExchangeSentEvent;
-import org.apache.camel.management.event.RouteStartedEvent;
-import org.apache.camel.processor.SendProcessor;
 
 /**
  * @version $Revision$
  */
-public class EventNotifierFailureHandledEventsTest extends ContextTestSupport {
+public class EventNotifierRedeliveryEventsTest extends ContextTestSupport {
 
     private static List<EventObject> events = new ArrayList<EventObject>();
 
@@ -70,6 +67,9 @@ public class EventNotifierFailureHandled
 
             @Override
             protected void doStart() throws Exception {
+                setIgnoreCamelContextEvents(true);
+                setIgnoreRouteEvents(true);
+                setIgnoreServiceEvents(true);
             }
 
             @Override
@@ -79,11 +79,11 @@ public class EventNotifierFailureHandled
         return context;
     }
 
-    public void testExchangeDeadLetterChannel() throws Exception {
+    public void testExchangeRedeliverySync() throws Exception {
         context.addRoutes(new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                errorHandler(deadLetterChannel("mock:dead"));
+                errorHandler(deadLetterChannel("mock:dead").maximumRedeliveries(4));
 
                 from("direct:start").throwException(new IllegalArgumentException("Damn"));
             }
@@ -94,29 +94,28 @@ public class EventNotifierFailureHandled
         template.sendBody("direct:start", "Hello World");
         assertMockEndpointsSatisfied();
 
-        assertEquals(8, events.size());
-        assertIsInstanceOf(CamelContextStartingEvent.class, events.get(0));
-        assertIsInstanceOf(RouteStartedEvent.class, events.get(1));
-        assertIsInstanceOf(CamelContextStartedEvent.class, events.get(2));
-        assertIsInstanceOf(ExchangeCreatedEvent.class, events.get(3));
-
-        ExchangeFailureHandledEvent e = assertIsInstanceOf(ExchangeFailureHandledEvent.class, events.get(4));
-        assertEquals("should be DLC", true, e.isDeadLetterChannel());
-        SendProcessor send = assertIsInstanceOf(SendProcessor.class, e.getFailureHandler());
-        assertEquals("mock://dead", send.getDestination().getEndpointUri());
-
-        // dead letter channel will mark the exchange as completed
-        assertIsInstanceOf(ExchangeCompletedEvent.class, events.get(5));
-        // and the sent will be logged after they are complete sending as it record the time taken as well
-        assertIsInstanceOf(ExchangeSentEvent.class, events.get(6));
+        assertEquals(9, events.size());
+
+        assertIsInstanceOf(ExchangeCreatedEvent.class, events.get(0));
+        ExchangeRedeliveryEvent e = assertIsInstanceOf(ExchangeRedeliveryEvent.class, events.get(1));
+        assertEquals(1, e.getAttempt());
+        e = assertIsInstanceOf(ExchangeRedeliveryEvent.class, events.get(2));
+        assertEquals(2, e.getAttempt());
+        e = assertIsInstanceOf(ExchangeRedeliveryEvent.class, events.get(3));
+        assertEquals(3, e.getAttempt());
+        e = assertIsInstanceOf(ExchangeRedeliveryEvent.class, events.get(4));
+        assertEquals(4, e.getAttempt());
+        assertIsInstanceOf(ExchangeFailureHandledEvent.class, events.get(5));
+        assertIsInstanceOf(ExchangeCompletedEvent.class, events.get(6));
         assertIsInstanceOf(ExchangeSentEvent.class, events.get(7));
+        assertIsInstanceOf(ExchangeSentEvent.class, events.get(8));
     }
 
-    public void testExchangeOnException() throws Exception {
+    public void testExchangeRedeliveryAsync() throws Exception {
         context.addRoutes(new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                onException(IllegalArgumentException.class).handled(true).to("mock:dead");
+                errorHandler(deadLetterChannel("mock:dead").maximumRedeliveries(4).asyncDelayedRedelivery().redeliveryDelay(25));
 
                 from("direct:start").throwException(new IllegalArgumentException("Damn"));
             }
@@ -127,19 +126,21 @@ public class EventNotifierFailureHandled
         template.sendBody("direct:start", "Hello World");
         assertMockEndpointsSatisfied();
 
-        assertEquals(8, events.size());
-        assertIsInstanceOf(CamelContextStartingEvent.class, events.get(0));
-        assertIsInstanceOf(RouteStartedEvent.class, events.get(1));
-        assertIsInstanceOf(CamelContextStartedEvent.class, events.get(2));
-        assertIsInstanceOf(ExchangeCreatedEvent.class, events.get(3));
-        assertIsInstanceOf(ExchangeSentEvent.class, events.get(4));
-
-        ExchangeFailureHandledEvent e = assertIsInstanceOf(ExchangeFailureHandledEvent.class, events.get(5));
-        assertEquals("should NOT be DLC", false, e.isDeadLetterChannel());
+        assertEquals(9, events.size());
 
-        // dead letter channel will mark the exchange as completed
+        assertIsInstanceOf(ExchangeCreatedEvent.class, events.get(0));
+        ExchangeRedeliveryEvent e = assertIsInstanceOf(ExchangeRedeliveryEvent.class, events.get(1));
+        assertEquals(1, e.getAttempt());
+        e = assertIsInstanceOf(ExchangeRedeliveryEvent.class, events.get(2));
+        assertEquals(2, e.getAttempt());
+        e = assertIsInstanceOf(ExchangeRedeliveryEvent.class, events.get(3));
+        assertEquals(3, e.getAttempt());
+        e = assertIsInstanceOf(ExchangeRedeliveryEvent.class, events.get(4));
+        assertEquals(4, e.getAttempt());
+        assertIsInstanceOf(ExchangeFailureHandledEvent.class, events.get(5));
         assertIsInstanceOf(ExchangeCompletedEvent.class, events.get(6));
         assertIsInstanceOf(ExchangeSentEvent.class, events.get(7));
+        assertIsInstanceOf(ExchangeSentEvent.class, events.get(8));
     }
 
 }
\ No newline at end of file

Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/management/MultipleEventNotifierEventsTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/management/MultipleEventNotifierEventsTest.java?rev=962496&r1=962495&r2=962496&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/management/MultipleEventNotifierEventsTest.java (original)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/management/MultipleEventNotifierEventsTest.java Fri Jul  9 12:06:55 2010
@@ -30,7 +30,7 @@ import org.apache.camel.management.event
 import org.apache.camel.management.event.CamelContextStoppingEvent;
 import org.apache.camel.management.event.ExchangeCompletedEvent;
 import org.apache.camel.management.event.ExchangeCreatedEvent;
-import org.apache.camel.management.event.ExchangeFailureEvent;
+import org.apache.camel.management.event.ExchangeFailedEvent;
 import org.apache.camel.management.event.ExchangeSentEvent;
 import org.apache.camel.management.event.RouteStartedEvent;
 import org.apache.camel.management.event.RouteStoppedEvent;
@@ -149,14 +149,14 @@ public class MultipleEventNotifierEvents
         assertIsInstanceOf(RouteStartedEvent.class, events.get(2));
         assertIsInstanceOf(CamelContextStartedEvent.class, events.get(3));
         assertIsInstanceOf(ExchangeCreatedEvent.class, events.get(4));
-        assertIsInstanceOf(ExchangeFailureEvent.class, events.get(5));
+        assertIsInstanceOf(ExchangeFailedEvent.class, events.get(5));
         assertIsInstanceOf(ExchangeSentEvent.class, events.get(6));
 
         assertEquals(3, events2.size());
 
         context.stop();
         assertIsInstanceOf(ExchangeCreatedEvent.class, events2.get(0));
-        assertIsInstanceOf(ExchangeFailureEvent.class, events2.get(1));
+        assertIsInstanceOf(ExchangeFailedEvent.class, events2.get(1));
         assertIsInstanceOf(ExchangeSentEvent.class, events2.get(2));
 
         assertEquals(11, events.size());

Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/processor/interceptor/DebugExceptionEventBreakpointTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/interceptor/DebugExceptionEventBreakpointTest.java?rev=962496&r1=962495&r2=962496&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/processor/interceptor/DebugExceptionEventBreakpointTest.java (original)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/processor/interceptor/DebugExceptionEventBreakpointTest.java Fri Jul  9 12:06:55 2010
@@ -27,7 +27,7 @@ import org.apache.camel.impl.BreakpointS
 import org.apache.camel.impl.ConditionSupport;
 import org.apache.camel.impl.DefaultDebugger;
 import org.apache.camel.management.event.AbstractExchangeEvent;
-import org.apache.camel.management.event.ExchangeFailureEvent;
+import org.apache.camel.management.event.ExchangeFailedEvent;
 import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.spi.Breakpoint;
 import org.apache.camel.spi.Condition;
@@ -55,7 +55,7 @@ public class DebugExceptionEventBreakpoi
 
         exceptionCondition = new ConditionSupport() {
             public boolean matchEvent(Exchange exchange, EventObject event) {
-                return event instanceof ExchangeFailureEvent;
+                return event instanceof ExchangeFailedEvent;
             }
         };
     }