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 2020/01/13 16:39:35 UTC

[camel] 01/03: CAMEL-14354: camel-core - Optimize unnecessary object allocations. EventHelper no longer create objects

This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 0d6fa3f7df94a28888a9c1399d61ad6cc3cda6ba
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Mon Jan 13 16:23:48 2020 +0100

    CAMEL-14354: camel-core - Optimize unnecessary object allocations. EventHelper no longer create objects
---
 .../java/org/apache/camel/support/EventHelper.java | 1432 +++++++++++++++++---
 1 file changed, 1246 insertions(+), 186 deletions(-)

diff --git a/core/camel-support/src/main/java/org/apache/camel/support/EventHelper.java b/core/camel-support/src/main/java/org/apache/camel/support/EventHelper.java
index fb0b8f9..8a3e2ef 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/EventHelper.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/EventHelper.java
@@ -1,4 +1,4 @@
-/*
+/**
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with
  * this work for additional information regarding copyright ownership.
@@ -17,247 +17,270 @@
 package org.apache.camel.support;
 
 import java.util.List;
-import java.util.function.Function;
-import java.util.function.Predicate;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.Endpoint;
 import org.apache.camel.Exchange;
 import org.apache.camel.Processor;
 import org.apache.camel.Route;
+import org.apache.camel.StatefulService;
 import org.apache.camel.spi.CamelEvent;
 import org.apache.camel.spi.EventFactory;
 import org.apache.camel.spi.EventNotifier;
 import org.apache.camel.spi.ManagementStrategy;
-import org.apache.camel.support.service.ServiceHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
  * Helper for easily sending event notifications in a single line of code
+ *
  */
 public final class EventHelper {
 
+    // This implementation has been optimized to be as fast and not create unnecessary objects or lambdas.
+    // So therefore there is some code that seems duplicated. But this code is used frequently during routing and should
+    // be left as-is.
+
     private static final Logger LOG = LoggerFactory.getLogger(EventHelper.class);
 
     private EventHelper() {
     }
 
     public static boolean notifyCamelContextStarting(CamelContext context) {
-        return doNotify(context,
-            factory -> factory.createCamelContextStartingEvent(context),
-            EventNotifier::isIgnoreCamelContextEvents);
-    }
-
-    public static boolean notifyCamelContextStarted(CamelContext context) {
-        return doNotify(context,
-            factory -> factory.createCamelContextStartedEvent(context),
-            EventNotifier::isIgnoreCamelContextEvents);
-    }
-
-    public static boolean notifyCamelContextStartupFailed(CamelContext context, Throwable cause) {
-        return doNotify(context,
-            factory -> factory.createCamelContextStartupFailureEvent(context, cause),
-            EventNotifier::isIgnoreCamelContextEvents);
-    }
-
-    public static boolean notifyCamelContextStopping(CamelContext context) {
-        return doNotify(context,
-            factory -> factory.createCamelContextStoppingEvent(context),
-            EventNotifier::isIgnoreCamelContextEvents);
-    }
-
-    public static boolean notifyCamelContextStopped(CamelContext context) {
-        return doNotify(context,
-            factory -> factory.createCamelContextStoppedEvent(context),
-            EventNotifier::isIgnoreCamelContextEvents);
-    }
-
-    public static boolean notifyCamelContextRoutesStarting(CamelContext context) {
-        return doNotify(context,
-            factory -> factory.createCamelContextRoutesStartingEvent(context),
-            EventNotifier::isIgnoreCamelContextEvents);
-    }
-
-    public static boolean notifyCamelContextRoutesStarted(CamelContext context) {
-        return doNotify(context,
-            factory -> factory.createCamelContextRoutesStartedEvent(context),
-            EventNotifier::isIgnoreCamelContextEvents);
-    }
+        ManagementStrategy management = context.getManagementStrategy();
+        if (management == null) {
+            return false;
+        }
 
-    public static boolean notifyCamelContextRoutesStopping(CamelContext context) {
-        return doNotify(context,
-            factory -> factory.createCamelContextRoutesStoppingEvent(context),
-            EventNotifier::isIgnoreCamelContextEvents);
-    }
+        EventFactory factory = management.getEventFactory();
+        if (factory == null) {
+            return false;
+        }
 
-    public static boolean notifyCamelContextRoutesStopped(CamelContext context) {
-        return doNotify(context,
-            factory -> factory.createCamelContextRoutesStoppedEvent(context),
-            EventNotifier::isIgnoreCamelContextEvents);
-    }
+        List<EventNotifier> notifiers = management.getEventNotifiers();
+        if (notifiers == null || notifiers.isEmpty()) {
+            return false;
+        }
 
-    public static boolean notifyCamelContextStopFailure(CamelContext context, Throwable cause) {
-        return doNotify(context,
-            factory -> factory.createCamelContextStopFailureEvent(context, cause),
-            EventNotifier::isIgnoreCamelContextEvents);
-    }
+        boolean answer = false;
+        CamelEvent event = null;
+        for (EventNotifier notifier : notifiers) {
+            if (notifier.isDisabled()) {
+                continue;
+            }
+            if (notifier.isIgnoreCamelContextEvents()) {
+                continue;
+            }
 
-    public static boolean notifyServiceStopFailure(CamelContext context, Object service, Throwable cause) {
-        return doNotify(context,
-            factory -> factory.createServiceStopFailureEvent(context, service, cause),
-            EventNotifier::isIgnoreServiceEvents);
+            if (event == null) {
+                // only create event once
+                event = factory.createCamelContextStartingEvent(context);
+                if (event == null) {
+                    // factory could not create event so exit
+                    return false;
+                }
+            }
+            answer |= doNotifyEvent(notifier, event);
+        }
+        return answer;
     }
 
-    public static boolean notifyServiceStartupFailure(CamelContext context, Object service, Throwable cause) {
-        return doNotify(context,
-            factory -> factory.createServiceStartupFailureEvent(context, service, cause),
-            EventNotifier::isIgnoreServiceEvents);
-    }
+    public static boolean notifyCamelContextStarted(CamelContext context) {
+        ManagementStrategy management = context.getManagementStrategy();
+        if (management == null) {
+            return false;
+        }
 
-    public static boolean notifyRouteStarted(CamelContext context, Route route) {
-        return doNotify(context,
-            factory -> factory.createRouteStartedEvent(route),
-            EventNotifier::isIgnoreRouteEvents);
-    }
+        EventFactory factory = management.getEventFactory();
+        if (factory == null) {
+            return false;
+        }
 
-    public static boolean notifyRouteStopped(CamelContext context, Route route) {
-        return doNotify(context,
-            factory -> factory.createRouteStoppedEvent(route),
-            EventNotifier::isIgnoreRouteEvents);
-    }
+        List<EventNotifier> notifiers = management.getEventNotifiers();
+        if (notifiers == null || notifiers.isEmpty()) {
+            return false;
+        }
 
-    public static boolean notifyRouteAdded(CamelContext context, Route route) {
-        return doNotify(context,
-            factory -> factory.createRouteAddedEvent(route),
-            EventNotifier::isIgnoreRouteEvents);
-    }
+        boolean answer = false;
+        CamelEvent event = null;
+        for (EventNotifier notifier : notifiers) {
+            if (notifier.isDisabled()) {
+                continue;
+            }
+            if (notifier.isIgnoreCamelContextEvents()) {
+                continue;
+            }
 
-    public static boolean notifyRouteRemoved(CamelContext context, Route route) {
-        return doNotify(context,
-            factory -> factory.createRouteRemovedEvent(route),
-            EventNotifier::isIgnoreRouteEvents);
+            if (event == null) {
+                // only create event once
+                event = factory.createCamelContextStartedEvent(context);
+                if (event == null) {
+                    // factory could not create event so exit
+                    return false;
+                }
+            }
+            answer |= doNotifyEvent(notifier, event);
+        }
+        return answer;
     }
 
-    public static boolean notifyExchangeCreated(CamelContext context, Exchange exchange) {
-        return doNotifyExchange(context, exchange,
-            factory -> factory.createExchangeCreatedEvent(exchange),
-            EventNotifier::isIgnoreExchangeCreatedEvent);
-    }
+    public static boolean notifyCamelContextStartupFailed(CamelContext context, Throwable cause) {
+        ManagementStrategy management = context.getManagementStrategy();
+        if (management == null) {
+            return false;
+        }
 
-    public static boolean notifyExchangeDone(CamelContext context, Exchange exchange) {
-        return doNotifyExchange(context, exchange,
-            factory -> factory.createExchangeCompletedEvent(exchange),
-            EventNotifier::isIgnoreExchangeCompletedEvent);
-    }
+        EventFactory factory = management.getEventFactory();
+        if (factory == null) {
+            return false;
+        }
 
-    public static boolean notifyExchangeFailed(CamelContext context, Exchange exchange) {
-        return doNotifyExchange(context, exchange,
-            factory -> factory.createExchangeFailedEvent(exchange),
-            EventNotifier::isIgnoreExchangeFailedEvents);
-    }
+        List<EventNotifier> notifiers = management.getEventNotifiers();
+        if (notifiers == null || notifiers.isEmpty()) {
+            return false;
+        }
 
-    public static boolean notifyExchangeFailureHandling(CamelContext context, Exchange exchange, Processor failureHandler,
-                                                     boolean deadLetterChannel, String deadLetterUri) {
-        return doNotifyExchange(context, exchange,
-            factory -> factory.createExchangeFailureHandlingEvent(exchange, failureHandler, deadLetterChannel, deadLetterUri),
-            EventNotifier::isIgnoreExchangeFailedEvents);
-    }
+        boolean answer = false;
+        CamelEvent event = null;
+        for (EventNotifier notifier : notifiers) {
+            if (notifier.isDisabled()) {
+                continue;
+            }
+            if (notifier.isIgnoreCamelContextEvents()) {
+                continue;
+            }
 
-    public static boolean notifyExchangeFailureHandled(CamelContext context, Exchange exchange, Processor failureHandler,
-                                                    boolean deadLetterChannel, String deadLetterUri) {
-        return doNotifyExchange(context, exchange,
-            factory -> factory.createExchangeFailureHandledEvent(exchange, failureHandler, deadLetterChannel, deadLetterUri),
-            EventNotifier::isIgnoreExchangeFailedEvents);
+            if (event == null) {
+                // only create event once
+                event = factory.createCamelContextStartupFailureEvent(context, cause);
+                if (event == null) {
+                    // factory could not create event so exit
+                    return false;
+                }
+            }
+            answer |= doNotifyEvent(notifier, event);
+        }
+        return answer;
     }
 
-    public static boolean notifyExchangeRedelivery(CamelContext context, Exchange exchange, int attempt) {
-        return doNotifyExchange(context, exchange,
-            factory -> factory.createExchangeRedeliveryEvent(exchange, attempt),
-            EventNotifier::isIgnoreExchangeRedeliveryEvents);
-    }
+    public static boolean notifyCamelContextStopping(CamelContext context) {
+        ManagementStrategy management = context.getManagementStrategy();
+        if (management == null) {
+            return false;
+        }
 
-    public static boolean notifyExchangeSending(CamelContext context, Exchange exchange, Endpoint endpoint) {
-        return doNotifyExchange(context, exchange,
-            factory -> factory.createExchangeSendingEvent(exchange, endpoint),
-            EventNotifier::isIgnoreExchangeSendingEvents);
-    }
+        EventFactory factory = management.getEventFactory();
+        if (factory == null) {
+            return false;
+        }
 
-    public static boolean notifyExchangeSent(CamelContext context, Exchange exchange, Endpoint endpoint, long timeTaken) {
-        return doNotifyExchange(context, exchange,
-            factory -> factory.createExchangeSentEvent(exchange, endpoint, timeTaken),
-            EventNotifier::isIgnoreExchangeSentEvents);
-    }
+        List<EventNotifier> notifiers = management.getEventNotifiers();
+        if (notifiers == null || notifiers.isEmpty()) {
+            return false;
+        }
 
-    public static boolean notifyStepStarted(CamelContext context, Exchange exchange, String stepId) {
-        return doNotifyStep(context, exchange,
-            factory -> factory.createStepStartedEvent(exchange, stepId),
-            EventNotifier::isIgnoreStepEvents);
-    }
+        boolean answer = false;
+        CamelEvent event = null;
+        for (EventNotifier notifier : notifiers) {
+            if (notifier.isDisabled()) {
+                continue;
+            }
+            if (notifier.isIgnoreCamelContextEvents()) {
+                continue;
+            }
 
-    public static boolean notifyStepDone(CamelContext context, Exchange exchange, String stepId) {
-        return doNotifyStep(context, exchange,
-            factory -> factory.createStepCompletedEvent(exchange, stepId),
-            EventNotifier::isIgnoreStepEvents);
+            if (event == null) {
+                // only create event once
+                event = factory.createCamelContextStoppingEvent(context);
+                if (event == null) {
+                    // factory could not create event so exit
+                    return false;
+                }
+            }
+            answer |= doNotifyEvent(notifier, event);
+        }
+        return answer;
     }
 
-    public static boolean notifyStepFailed(CamelContext context, Exchange exchange, String stepId) {
-        return doNotifyStep(context, exchange,
-            factory -> factory.createStepFailedEvent(exchange, stepId),
-            EventNotifier::isIgnoreStepEvents);
-    }
+    public static boolean notifyCamelContextStopped(CamelContext context) {
+        ManagementStrategy management = context.getManagementStrategy();
+        if (management == null) {
+            return false;
+        }
 
-    public static boolean notifyCamelContextSuspending(CamelContext context) {
-        return doNotify(context,
-            factory -> factory.createCamelContextSuspendingEvent(context),
-            EventNotifier::isIgnoreCamelContextEvents);
-    }
+        EventFactory factory = management.getEventFactory();
+        if (factory == null) {
+            return false;
+        }
 
-    public static boolean notifyCamelContextSuspended(CamelContext context) {
-        return doNotify(context,
-            factory -> factory.createCamelContextSuspendedEvent(context),
-            EventNotifier::isIgnoreCamelContextEvents);
-    }
+        List<EventNotifier> notifiers = management.getEventNotifiers();
+        if (notifiers == null || notifiers.isEmpty()) {
+            return false;
+        }
 
-    public static boolean notifyCamelContextResuming(CamelContext context) {
-        return doNotify(context,
-            factory -> factory.createCamelContextResumingEvent(context),
-            EventNotifier::isIgnoreCamelContextEvents);
-    }
+        boolean answer = false;
+        CamelEvent event = null;
+        for (EventNotifier notifier : notifiers) {
+            if (notifier.isDisabled()) {
+                continue;
+            }
+            if (notifier.isIgnoreCamelContextEvents()) {
+                continue;
+            }
 
-    public static boolean notifyCamelContextResumed(CamelContext context) {
-        return doNotify(context,
-            factory -> factory.createCamelContextResumedEvent(context),
-            EventNotifier::isIgnoreCamelContextEvents);
+            if (event == null) {
+                // only create event once
+                event = factory.createCamelContextStoppedEvent(context);
+                if (event == null) {
+                    // factory could not create event so exit
+                    return false;
+                }
+            }
+            answer |= doNotifyEvent(notifier, event);
+        }
+        return answer;
     }
 
-    public static boolean notifyCamelContextResumeFailed(CamelContext context, Throwable cause) {
-        return doNotify(context,
-            factory -> factory.createCamelContextResumeFailureEvent(context, cause),
-            EventNotifier::isIgnoreCamelContextEvents);
-    }
+    public static boolean notifyCamelContextStopFailed(CamelContext context, Throwable cause) {
+        ManagementStrategy management = context.getManagementStrategy();
+        if (management == null) {
+            return false;
+        }
 
-    private static boolean doNotifyExchange(CamelContext context, Exchange exchange, Function<EventFactory, CamelEvent> eventSupplier, Predicate<EventNotifier> notifierFilter) {
-        if (exchange.getProperty(Exchange.NOTIFY_EVENT, false, Boolean.class)) {
-            // do not generate events for an notify event
+        EventFactory factory = management.getEventFactory();
+        if (factory == null) {
             return false;
         }
-        return doNotify(context,
-                eventSupplier,
-                notifierFilter.or(EventNotifier::isIgnoreExchangeEvents));
-    }
 
-    private static boolean doNotifyStep(CamelContext context, Exchange exchange, Function<EventFactory, CamelEvent> eventSupplier, Predicate<EventNotifier> notifierFilter) {
-        if (exchange.getProperty(Exchange.NOTIFY_EVENT, false, Boolean.class)) {
-            // do not generate events for an notify event
+        List<EventNotifier> notifiers = management.getEventNotifiers();
+        if (notifiers == null || notifiers.isEmpty()) {
             return false;
         }
-        return doNotify(context,
-            eventSupplier,
-            notifierFilter.or(EventNotifier::isIgnoreStepEvents));
+
+        boolean answer = false;
+        CamelEvent event = null;
+        for (EventNotifier notifier : notifiers) {
+            if (notifier.isDisabled()) {
+                continue;
+            }
+            if (notifier.isIgnoreCamelContextEvents()) {
+                continue;
+            }
+
+            if (event == null) {
+                // only create event once
+                event = factory.createCamelContextStopFailureEvent(context, cause);
+                if (event == null) {
+                    // factory could not create event so exit
+                    return false;
+                }
+            }
+            answer |= doNotifyEvent(notifier, event);
+        }
+        return answer;
     }
 
-    private static boolean doNotify(CamelContext context, Function<EventFactory, CamelEvent> eventSupplier, Predicate<EventNotifier> notifierFilter) {
+    public static boolean notifyServiceStopFailure(CamelContext context, Object service, Throwable cause) {
         ManagementStrategy management = context.getManagementStrategy();
         if (management == null) {
             return false;
@@ -279,13 +302,13 @@ public final class EventHelper {
             if (notifier.isDisabled()) {
                 continue;
             }
-            if (notifierFilter.test(notifier)) {
+            if (notifier.isIgnoreServiceEvents()) {
                 continue;
             }
 
             if (event == null) {
                 // only create event once
-                event = eventSupplier.apply(factory);
+                event = factory.createServiceStopFailureEvent(context, service, cause);
                 if (event == null) {
                     // factory could not create event so exit
                     return false;
@@ -296,9 +319,1046 @@ public final class EventHelper {
         return answer;
     }
 
-    private static boolean doNotifyEvent(EventNotifier notifier, CamelEvent event) {
-        // only notify if notifier is started
-        if (!ServiceHelper.isStarted(notifier)) {
+    public static boolean notifyServiceStartupFailure(CamelContext context, Object service, Throwable cause) {
+        ManagementStrategy management = context.getManagementStrategy();
+        if (management == null) {
+            return false;
+        }
+
+        EventFactory factory = management.getEventFactory();
+        if (factory == null) {
+            return false;
+        }
+
+        List<EventNotifier> notifiers = management.getEventNotifiers();
+        if (notifiers == null || notifiers.isEmpty()) {
+            return false;
+        }
+
+        boolean answer = false;
+        CamelEvent event = null;
+        for (EventNotifier notifier : notifiers) {
+            if (notifier.isDisabled()) {
+                continue;
+            }
+            if (notifier.isIgnoreServiceEvents()) {
+                continue;
+            }
+
+            if (event == null) {
+                // only create event once
+                event = factory.createServiceStartupFailureEvent(context, service, cause);
+                if (event == null) {
+                    // factory could not create event so exit
+                    return false;
+                }
+            }
+            answer |= doNotifyEvent(notifier, event);
+        }
+        return answer;
+    }
+
+    public static boolean notifyRouteStarted(CamelContext context, Route route) {
+        ManagementStrategy management = context.getManagementStrategy();
+        if (management == null) {
+            return false;
+        }
+
+        EventFactory factory = management.getEventFactory();
+        if (factory == null) {
+            return false;
+        }
+
+        List<EventNotifier> notifiers = management.getEventNotifiers();
+        if (notifiers == null || notifiers.isEmpty()) {
+            return false;
+        }
+
+        boolean answer = false;
+        CamelEvent event = null;
+        for (EventNotifier notifier : notifiers) {
+            if (notifier.isDisabled()) {
+                continue;
+            }
+            if (notifier.isIgnoreRouteEvents()) {
+                continue;
+            }
+
+            if (event == null) {
+                // only create event once
+                event = factory.createRouteStartedEvent(route);
+                if (event == null) {
+                    // factory could not create event so exit
+                    return false;
+                }
+            }
+            answer |= doNotifyEvent(notifier, event);
+        }
+        return answer;
+    }
+
+    public static boolean notifyRouteStopped(CamelContext context, Route route) {
+        ManagementStrategy management = context.getManagementStrategy();
+        if (management == null) {
+            return false;
+        }
+
+        EventFactory factory = management.getEventFactory();
+        if (factory == null) {
+            return false;
+        }
+
+        List<EventNotifier> notifiers = management.getEventNotifiers();
+        if (notifiers == null || notifiers.isEmpty()) {
+            return false;
+        }
+
+        boolean answer = false;
+        CamelEvent event = null;
+        for (EventNotifier notifier : notifiers) {
+            if (notifier.isDisabled()) {
+                continue;
+            }
+            if (notifier.isIgnoreRouteEvents()) {
+                continue;
+            }
+
+            if (event == null) {
+                // only create event once
+                event = factory.createRouteStoppedEvent(route);
+                if (event == null) {
+                    // factory could not create event so exit
+                    return false;
+                }
+            }
+            answer |= doNotifyEvent(notifier, event);
+        }
+        return answer;
+    }
+
+    public static boolean notifyRouteAdded(CamelContext context, Route route) {
+        ManagementStrategy management = context.getManagementStrategy();
+        if (management == null) {
+            return false;
+        }
+
+        EventFactory factory = management.getEventFactory();
+        if (factory == null) {
+            return false;
+        }
+
+        List<EventNotifier> notifiers = management.getEventNotifiers();
+        if (notifiers == null || notifiers.isEmpty()) {
+            return false;
+        }
+
+        boolean answer = false;
+        CamelEvent event = null;
+        for (EventNotifier notifier : notifiers) {
+            if (notifier.isDisabled()) {
+                continue;
+            }
+            if (notifier.isIgnoreRouteEvents()) {
+                continue;
+            }
+
+            if (event == null) {
+                // only create event once
+                event = factory.createRouteAddedEvent(route);
+                if (event == null) {
+                    // factory could not create event so exit
+                    return false;
+                }
+            }
+            answer |= doNotifyEvent(notifier, event);
+        }
+        return answer;
+    }
+
+    public static boolean notifyRouteRemoved(CamelContext context, Route route) {
+        ManagementStrategy management = context.getManagementStrategy();
+        if (management == null) {
+            return false;
+        }
+
+        EventFactory factory = management.getEventFactory();
+        if (factory == null) {
+            return false;
+        }
+
+        List<EventNotifier> notifiers = management.getEventNotifiers();
+        if (notifiers == null || notifiers.isEmpty()) {
+            return false;
+        }
+
+        boolean answer = false;
+        CamelEvent event = null;
+        for (EventNotifier notifier : notifiers) {
+            if (notifier.isDisabled()) {
+                continue;
+            }
+            if (notifier.isIgnoreRouteEvents()) {
+                continue;
+            }
+
+            if (event == null) {
+                // only create event once
+                event = factory.createRouteRemovedEvent(route);
+                if (event == null) {
+                    // factory could not create event so exit
+                    return false;
+                }
+            }
+            answer |= doNotifyEvent(notifier, event);
+        }
+        return answer;
+    }
+
+    public static boolean notifyExchangeCreated(CamelContext context, Exchange exchange) {
+        if (exchange.getProperty(Exchange.NOTIFY_EVENT, false, Boolean.class)) {
+            // do not generate events for an notify event
+            return false;
+        }
+
+        ManagementStrategy management = context.getManagementStrategy();
+        if (management == null) {
+            return false;
+        }
+
+        EventFactory factory = management.getEventFactory();
+        if (factory == null) {
+            return false;
+        }
+
+        List<EventNotifier> notifiers = management.getEventNotifiers();
+        if (notifiers == null || notifiers.isEmpty()) {
+            return false;
+        }
+
+        boolean answer = false;
+        CamelEvent event = null;
+        // optimise for loop using index access to avoid creating iterator object
+        for (int i = 0; i < notifiers.size(); i++) {
+            EventNotifier notifier = notifiers.get(i);
+            if (notifier.isDisabled()) {
+                continue;
+            }
+            if (notifier.isIgnoreExchangeEvents() || notifier.isIgnoreExchangeCreatedEvent()) {
+                continue;
+            }
+
+            if (event == null) {
+                // only create event once
+                event = factory.createExchangeCreatedEvent(exchange);
+                if (event == null) {
+                    // factory could not create event so exit
+                    return false;
+                }
+            }
+            answer |= doNotifyEvent(notifier, event);
+        }
+        return answer;
+    }
+
+    public static boolean notifyExchangeDone(CamelContext context, Exchange exchange) {
+        if (exchange.getProperty(Exchange.NOTIFY_EVENT, false, Boolean.class)) {
+            // do not generate events for an notify event
+            return false;
+        }
+
+        ManagementStrategy management = context.getManagementStrategy();
+        if (management == null) {
+            return false;
+        }
+
+        EventFactory factory = management.getEventFactory();
+        if (factory == null) {
+            return false;
+        }
+
+        List<EventNotifier> notifiers = management.getEventNotifiers();
+        if (notifiers == null || notifiers.isEmpty()) {
+            return false;
+        }
+
+        boolean answer = false;
+        CamelEvent event = null;
+        // optimise for loop using index access to avoid creating iterator object
+        for (int i = 0; i < notifiers.size(); i++) {
+            EventNotifier notifier = notifiers.get(i);
+            if (notifier.isDisabled()) {
+                continue;
+            }
+            if (notifier.isIgnoreExchangeEvents() || notifier.isIgnoreExchangeCompletedEvent()) {
+                continue;
+            }
+
+            if (event == null) {
+                // only create event once
+                event = factory.createExchangeCompletedEvent(exchange);
+                if (event == null) {
+                    // factory could not create event so exit
+                    return false;
+                }
+            }
+            answer |= doNotifyEvent(notifier, event);
+        }
+        return answer;
+    }
+
+    public static boolean notifyExchangeFailed(CamelContext context, Exchange exchange) {
+        if (exchange.getProperty(Exchange.NOTIFY_EVENT, false, Boolean.class)) {
+            // do not generate events for an notify event
+            return false;
+        }
+
+        ManagementStrategy management = context.getManagementStrategy();
+        if (management == null) {
+            return false;
+        }
+
+        EventFactory factory = management.getEventFactory();
+        if (factory == null) {
+            return false;
+        }
+
+        List<EventNotifier> notifiers = management.getEventNotifiers();
+        if (notifiers == null || notifiers.isEmpty()) {
+            return false;
+        }
+
+        boolean answer = false;
+        CamelEvent event = null;
+        // optimise for loop using index access to avoid creating iterator object
+        for (int i = 0; i < notifiers.size(); i++) {
+            EventNotifier notifier = notifiers.get(i);
+            if (notifier.isDisabled()) {
+                continue;
+            }
+            if (notifier.isIgnoreExchangeEvents() || notifier.isIgnoreExchangeFailedEvents()) {
+                continue;
+            }
+
+            if (event == null) {
+                // only create event once
+                event = factory.createExchangeFailedEvent(exchange);
+                if (event == null) {
+                    // factory could not create event so exit
+                    return false;
+                }
+            }
+            answer |= doNotifyEvent(notifier, event);
+        }
+        return answer;
+    }
+
+    public static boolean notifyExchangeFailureHandling(CamelContext context, Exchange exchange, Processor failureHandler,
+                                                        boolean deadLetterChannel, String deadLetterUri) {
+        if (exchange.getProperty(Exchange.NOTIFY_EVENT, false, Boolean.class)) {
+            // do not generate events for an notify event
+            return false;
+        }
+
+        ManagementStrategy management = context.getManagementStrategy();
+        if (management == null) {
+            return false;
+        }
+
+        EventFactory factory = management.getEventFactory();
+        if (factory == null) {
+            return false;
+        }
+
+        List<EventNotifier> notifiers = management.getEventNotifiers();
+        if (notifiers == null || notifiers.isEmpty()) {
+            return false;
+        }
+
+        boolean answer = false;
+        CamelEvent event = null;
+        // optimise for loop using index access to avoid creating iterator object
+        for (int i = 0; i < notifiers.size(); i++) {
+            EventNotifier notifier = notifiers.get(i);
+            if (notifier.isDisabled()) {
+                continue;
+            }
+            if (notifier.isIgnoreExchangeEvents() || notifier.isIgnoreExchangeFailedEvents()) {
+                continue;
+            }
+
+            if (event == null) {
+                // only create event once
+                event = factory.createExchangeFailureHandlingEvent(exchange, failureHandler, deadLetterChannel, deadLetterUri);
+                if (event == null) {
+                    // factory could not create event so exit
+                    return false;
+                }
+            }
+            answer |= doNotifyEvent(notifier, event);
+        }
+        return answer;
+    }
+
+    public static boolean notifyExchangeFailureHandled(CamelContext context, Exchange exchange, Processor failureHandler,
+                                                       boolean deadLetterChannel, String deadLetterUri) {
+        if (exchange.getProperty(Exchange.NOTIFY_EVENT, false, Boolean.class)) {
+            // do not generate events for an notify event
+            return false;
+        }
+
+        ManagementStrategy management = context.getManagementStrategy();
+        if (management == null) {
+            return false;
+        }
+
+        EventFactory factory = management.getEventFactory();
+        if (factory == null) {
+            return false;
+        }
+
+        List<EventNotifier> notifiers = management.getEventNotifiers();
+        if (notifiers == null || notifiers.isEmpty()) {
+            return false;
+        }
+
+        boolean answer = false;
+        CamelEvent event = null;
+        // optimise for loop using index access to avoid creating iterator object
+        for (int i = 0; i < notifiers.size(); i++) {
+            EventNotifier notifier = notifiers.get(i);
+            if (notifier.isDisabled()) {
+                continue;
+            }
+            if (notifier.isIgnoreExchangeEvents() || notifier.isIgnoreExchangeFailedEvents()) {
+                continue;
+            }
+
+            if (event == null) {
+                // only create event once
+                event = factory.createExchangeFailureHandledEvent(exchange, failureHandler, deadLetterChannel, deadLetterUri);
+                if (event == null) {
+                    // factory could not create event so exit
+                    return false;
+                }
+            }
+            answer |= doNotifyEvent(notifier, event);
+        }
+        return answer;
+    }
+
+    public static boolean notifyExchangeRedelivery(CamelContext context, Exchange exchange, int attempt) {
+        if (exchange.getProperty(Exchange.NOTIFY_EVENT, false, Boolean.class)) {
+            // do not generate events for an notify event
+            return false;
+        }
+
+        ManagementStrategy management = context.getManagementStrategy();
+        if (management == null) {
+            return false;
+        }
+
+        EventFactory factory = management.getEventFactory();
+        if (factory == null) {
+            return false;
+        }
+
+        List<EventNotifier> notifiers = management.getEventNotifiers();
+        if (notifiers == null || notifiers.isEmpty()) {
+            return false;
+        }
+
+        boolean answer = false;
+        CamelEvent event = null;
+        // optimise for loop using index access to avoid creating iterator object
+        for (int i = 0; i < notifiers.size(); i++) {
+            EventNotifier notifier = notifiers.get(i);
+            if (notifier.isDisabled()) {
+                continue;
+            }
+            if (notifier.isIgnoreExchangeEvents() || notifier.isIgnoreExchangeFailedEvents()) {
+                continue;
+            }
+
+            if (event == null) {
+                // only create event once
+                event = factory.createExchangeRedeliveryEvent(exchange, attempt);
+                if (event == null) {
+                    // factory could not create event so exit
+                    return false;
+                }
+            }
+            answer |= doNotifyEvent(notifier, event);
+        }
+        return answer;
+    }
+
+    public static boolean notifyExchangeSending(CamelContext context, Exchange exchange, Endpoint endpoint) {
+        if (exchange.getProperty(Exchange.NOTIFY_EVENT, false, Boolean.class)) {
+            // do not generate events for an notify event
+            return false;
+        }
+
+        ManagementStrategy management = context.getManagementStrategy();
+        if (management == null) {
+            return false;
+        }
+
+        EventFactory factory = management.getEventFactory();
+        if (factory == null) {
+            return false;
+        }
+
+        List<EventNotifier> notifiers = management.getEventNotifiers();
+        if (notifiers == null || notifiers.isEmpty()) {
+            return false;
+        }
+
+        boolean answer = false;
+        CamelEvent event = null;
+        // optimise for loop using index access to avoid creating iterator object
+        for (int i = 0; i < notifiers.size(); i++) {
+            EventNotifier notifier = notifiers.get(i);
+            if (notifier.isDisabled()) {
+                continue;
+            }
+            if (notifier.isIgnoreExchangeEvents() || notifier.isIgnoreExchangeSendingEvents()) {
+                continue;
+            }
+
+            if (event == null) {
+                // only create event once
+                event = factory.createExchangeSendingEvent(exchange, endpoint);
+                if (event == null) {
+                    // factory could not create event so exit
+                    return false;
+                }
+            }
+            answer |= doNotifyEvent(notifier, event);
+        }
+        return answer;
+    }
+
+    public static boolean notifyExchangeSent(CamelContext context, Exchange exchange, Endpoint endpoint, long timeTaken) {
+        if (exchange.getProperty(Exchange.NOTIFY_EVENT, false, Boolean.class)) {
+            // do not generate events for an notify event
+            return false;
+        }
+
+        ManagementStrategy management = context.getManagementStrategy();
+        if (management == null) {
+            return false;
+        }
+
+        EventFactory factory = management.getEventFactory();
+        if (factory == null) {
+            return false;
+        }
+
+        List<EventNotifier> notifiers = management.getEventNotifiers();
+        if (notifiers == null || notifiers.isEmpty()) {
+            return false;
+        }
+
+        boolean answer = false;
+        CamelEvent event = null;
+        // optimise for loop using index access to avoid creating iterator object
+        for (int i = 0; i < notifiers.size(); i++) {
+            EventNotifier notifier = notifiers.get(i);
+            if (notifier.isDisabled()) {
+                continue;
+            }
+            if (notifier.isIgnoreExchangeEvents() || notifier.isIgnoreExchangeSentEvents()) {
+                continue;
+            }
+
+            if (event == null) {
+                // only create event once
+                event = factory.createExchangeSentEvent(exchange, endpoint, timeTaken);
+                if (event == null) {
+                    // factory could not create event so exit
+                    return false;
+                }
+            }
+            answer |= doNotifyEvent(notifier, event);
+        }
+        return answer;
+    }
+
+    public static boolean notifyCamelContextSuspending(CamelContext context) {
+        ManagementStrategy management = context.getManagementStrategy();
+        if (management == null) {
+            return false;
+        }
+
+        EventFactory factory = management.getEventFactory();
+        if (factory == null) {
+            return false;
+        }
+
+        List<EventNotifier> notifiers = management.getEventNotifiers();
+        if (notifiers == null || notifiers.isEmpty()) {
+            return false;
+        }
+
+        boolean answer = false;
+        CamelEvent event = null;
+        for (EventNotifier notifier : notifiers) {
+            if (notifier.isDisabled()) {
+                continue;
+            }
+            if (notifier.isIgnoreCamelContextEvents()) {
+                continue;
+            }
+
+            if (event == null) {
+                // only create event once
+                event = factory.createCamelContextSuspendingEvent(context);
+                if (event == null) {
+                    // factory could not create event so exit
+                    return false;
+                }
+            }
+            answer |= doNotifyEvent(notifier, event);
+        }
+        return answer;
+    }
+
+    public static boolean notifyCamelContextSuspended(CamelContext context) {
+        ManagementStrategy management = context.getManagementStrategy();
+        if (management == null) {
+            return false;
+        }
+
+        EventFactory factory = management.getEventFactory();
+        if (factory == null) {
+            return false;
+        }
+
+        List<EventNotifier> notifiers = management.getEventNotifiers();
+        if (notifiers == null || notifiers.isEmpty()) {
+            return false;
+        }
+
+        boolean answer = false;
+        CamelEvent event = null;
+        for (EventNotifier notifier : notifiers) {
+            if (notifier.isDisabled()) {
+                continue;
+            }
+            if (notifier.isIgnoreCamelContextEvents()) {
+                continue;
+            }
+
+            if (event == null) {
+                // only create event once
+                event = factory.createCamelContextSuspendedEvent(context);
+                if (event == null) {
+                    // factory could not create event so exit
+                    return false;
+                }
+            }
+            answer |= doNotifyEvent(notifier, event);
+        }
+        return answer;
+    }
+
+    public static boolean notifyCamelContextResuming(CamelContext context) {
+        ManagementStrategy management = context.getManagementStrategy();
+        if (management == null) {
+            return false;
+        }
+
+        EventFactory factory = management.getEventFactory();
+        if (factory == null) {
+            return false;
+        }
+
+        List<EventNotifier> notifiers = management.getEventNotifiers();
+        if (notifiers == null || notifiers.isEmpty()) {
+            return false;
+        }
+
+        boolean answer = false;
+        CamelEvent event = null;
+        for (EventNotifier notifier : notifiers) {
+            if (notifier.isDisabled()) {
+                continue;
+            }
+            if (notifier.isIgnoreCamelContextEvents()) {
+                continue;
+            }
+
+            if (event == null) {
+                // only create event once
+                event = factory.createCamelContextResumingEvent(context);
+                if (event == null) {
+                    // factory could not create event so exit
+                    return false;
+                }
+            }
+            answer |= doNotifyEvent(notifier, event);
+        }
+        return answer;
+    }
+
+    public static boolean notifyCamelContextResumed(CamelContext context) {
+        ManagementStrategy management = context.getManagementStrategy();
+        if (management == null) {
+            return false;
+        }
+
+        EventFactory factory = management.getEventFactory();
+        if (factory == null) {
+            return false;
+        }
+
+        List<EventNotifier> notifiers = management.getEventNotifiers();
+        if (notifiers == null || notifiers.isEmpty()) {
+            return false;
+        }
+
+        boolean answer = false;
+        CamelEvent event = null;
+        for (EventNotifier notifier : notifiers) {
+            if (notifier.isDisabled()) {
+                continue;
+            }
+            if (notifier.isIgnoreCamelContextEvents()) {
+                continue;
+            }
+
+            if (event == null) {
+                // only create event once
+                event = factory.createCamelContextResumedEvent(context);
+                if (event == null) {
+                    // factory could not create event so exit
+                    return false;
+                }
+            }
+            answer |= doNotifyEvent(notifier, event);
+        }
+        return answer;
+    }
+
+    public static boolean notifyCamelContextResumeFailed(CamelContext context, Throwable cause) {
+        ManagementStrategy management = context.getManagementStrategy();
+        if (management == null) {
+            return false;
+        }
+
+        EventFactory factory = management.getEventFactory();
+        if (factory == null) {
+            return false;
+        }
+
+        List<EventNotifier> notifiers = management.getEventNotifiers();
+        if (notifiers == null || notifiers.isEmpty()) {
+            return false;
+        }
+
+        boolean answer = false;
+        CamelEvent event = null;
+        for (EventNotifier notifier : notifiers) {
+            if (notifier.isDisabled()) {
+                continue;
+            }
+            if (notifier.isIgnoreCamelContextEvents()) {
+                continue;
+            }
+
+            if (event == null) {
+                // only create event once
+                event = factory.createCamelContextResumeFailureEvent(context, cause);
+                if (event == null) {
+                    // factory could not create event so exit
+                    return false;
+                }
+            }
+            answer |= doNotifyEvent(notifier, event);
+        }
+        return answer;
+    }
+
+    public static boolean notifyCamelContextRoutesStarting(CamelContext context) {
+        ManagementStrategy management = context.getManagementStrategy();
+        if (management == null) {
+            return false;
+        }
+
+        EventFactory factory = management.getEventFactory();
+        if (factory == null) {
+            return false;
+        }
+
+        List<EventNotifier> notifiers = management.getEventNotifiers();
+        if (notifiers == null || notifiers.isEmpty()) {
+            return false;
+        }
+
+        boolean answer = false;
+        CamelEvent event = null;
+        for (EventNotifier notifier : notifiers) {
+            if (notifier.isDisabled()) {
+                continue;
+            }
+            if (notifier.isIgnoreCamelContextEvents()) {
+                continue;
+            }
+
+            if (event == null) {
+                // only create event once
+                event = factory.createCamelContextRoutesStartingEvent(context);
+                if (event == null) {
+                    // factory could not create event so exit
+                    return false;
+                }
+            }
+            answer |= doNotifyEvent(notifier, event);
+        }
+        return answer;
+    }
+
+    public static boolean notifyCamelContextRoutesStarted(CamelContext context) {
+        ManagementStrategy management = context.getManagementStrategy();
+        if (management == null) {
+            return false;
+        }
+
+        EventFactory factory = management.getEventFactory();
+        if (factory == null) {
+            return false;
+        }
+
+        List<EventNotifier> notifiers = management.getEventNotifiers();
+        if (notifiers == null || notifiers.isEmpty()) {
+            return false;
+        }
+
+        boolean answer = false;
+        CamelEvent event = null;
+        for (EventNotifier notifier : notifiers) {
+            if (notifier.isDisabled()) {
+                continue;
+            }
+            if (notifier.isIgnoreCamelContextEvents()) {
+                continue;
+            }
+
+            if (event == null) {
+                // only create event once
+                event = factory.createCamelContextRoutesStartedEvent(context);
+                if (event == null) {
+                    // factory could not create event so exit
+                    return false;
+                }
+            }
+            answer |= doNotifyEvent(notifier, event);
+        }
+        return answer;
+    }
+
+    public static boolean notifyCamelContextRoutesStopping(CamelContext context) {
+        ManagementStrategy management = context.getManagementStrategy();
+        if (management == null) {
+            return false;
+        }
+
+        EventFactory factory = management.getEventFactory();
+        if (factory == null) {
+            return false;
+        }
+
+        List<EventNotifier> notifiers = management.getEventNotifiers();
+        if (notifiers == null || notifiers.isEmpty()) {
+            return false;
+        }
+
+        boolean answer = false;
+        CamelEvent event = null;
+        for (EventNotifier notifier : notifiers) {
+            if (notifier.isDisabled()) {
+                continue;
+            }
+            if (notifier.isIgnoreCamelContextEvents()) {
+                continue;
+            }
+
+            if (event == null) {
+                // only create event once
+                event = factory.createCamelContextRoutesStoppingEvent(context);
+                if (event == null) {
+                    // factory could not create event so exit
+                    return false;
+                }
+            }
+            answer |= doNotifyEvent(notifier, event);
+        }
+        return answer;
+    }
+
+    public static boolean notifyCamelContextRoutesStopped(CamelContext context) {
+        ManagementStrategy management = context.getManagementStrategy();
+        if (management == null) {
+            return false;
+        }
+
+        EventFactory factory = management.getEventFactory();
+        if (factory == null) {
+            return false;
+        }
+
+        List<EventNotifier> notifiers = management.getEventNotifiers();
+        if (notifiers == null || notifiers.isEmpty()) {
+            return false;
+        }
+
+        boolean answer = false;
+        CamelEvent event = null;
+        for (EventNotifier notifier : notifiers) {
+            if (notifier.isDisabled()) {
+                continue;
+            }
+            if (notifier.isIgnoreCamelContextEvents()) {
+                continue;
+            }
+
+            if (event == null) {
+                // only create event once
+                event = factory.createCamelContextRoutesStoppedEvent(context);
+                if (event == null) {
+                    // factory could not create event so exit
+                    return false;
+                }
+            }
+            answer |= doNotifyEvent(notifier, event);
+        }
+        return answer;
+    }
+
+    public static boolean notifyStepStarted(CamelContext context, Exchange exchange, String stepId) {
+        ManagementStrategy management = context.getManagementStrategy();
+        if (management == null) {
+            return false;
+        }
+
+        EventFactory factory = management.getEventFactory();
+        if (factory == null) {
+            return false;
+        }
+
+        List<EventNotifier> notifiers = management.getEventNotifiers();
+        if (notifiers == null || notifiers.isEmpty()) {
+            return false;
+        }
+
+        boolean answer = false;
+        CamelEvent event = null;
+        for (EventNotifier notifier : notifiers) {
+            if (notifier.isDisabled()) {
+                continue;
+            }
+            if (notifier.isIgnoreStepEvents()) {
+                continue;
+            }
+
+            if (event == null) {
+                // only create event once
+                event = factory.createStepStartedEvent(exchange, stepId);
+                if (event == null) {
+                    // factory could not create event so exit
+                    return false;
+                }
+            }
+            answer |= doNotifyEvent(notifier, event);
+        }
+        return answer;
+    }
+
+    public static boolean notifyStepDone(CamelContext context, Exchange exchange, String stepId) {
+        ManagementStrategy management = context.getManagementStrategy();
+        if (management == null) {
+            return false;
+        }
+
+        EventFactory factory = management.getEventFactory();
+        if (factory == null) {
+            return false;
+        }
+
+        List<EventNotifier> notifiers = management.getEventNotifiers();
+        if (notifiers == null || notifiers.isEmpty()) {
+            return false;
+        }
+
+        boolean answer = false;
+        CamelEvent event = null;
+        for (EventNotifier notifier : notifiers) {
+            if (notifier.isDisabled()) {
+                continue;
+            }
+            if (notifier.isIgnoreStepEvents()) {
+                continue;
+            }
+
+            if (event == null) {
+                // only create event once
+                event = factory.createStepCompletedEvent(exchange, stepId);
+                if (event == null) {
+                    // factory could not create event so exit
+                    return false;
+                }
+            }
+            answer |= doNotifyEvent(notifier, event);
+        }
+        return answer;
+    }
+
+    public static boolean notifyStepFailed(CamelContext context, Exchange exchange, String stepId) {
+        ManagementStrategy management = context.getManagementStrategy();
+        if (management == null) {
+            return false;
+        }
+
+        EventFactory factory = management.getEventFactory();
+        if (factory == null) {
+            return false;
+        }
+
+        List<EventNotifier> notifiers = management.getEventNotifiers();
+        if (notifiers == null || notifiers.isEmpty()) {
+            return false;
+        }
+
+        boolean answer = false;
+        CamelEvent event = null;
+        for (EventNotifier notifier : notifiers) {
+            if (notifier.isDisabled()) {
+                continue;
+            }
+            if (notifier.isIgnoreStepEvents()) {
+                continue;
+            }
+
+            if (event == null) {
+                // only create event once
+                event = factory.createStepFailedEvent(exchange, stepId);
+                if (event == null) {
+                    // factory could not create event so exit
+                    return false;
+                }
+            }
+            answer |= doNotifyEvent(notifier, event);
+        }
+        return answer;
+    }
+
+    private static boolean doNotifyEvent(EventNotifier notifier, CamelEvent event) {
+        // only notify if notifier is started
+        boolean started = true;
+        if (notifier instanceof StatefulService) {
+            started = ((StatefulService) notifier).isStarted();
+        }
+        if (!started) {
             LOG.debug("Ignoring notifying event {}. The EventNotifier has not been started yet: {}", event, notifier);
             return false;
         }
@@ -317,4 +1377,4 @@ public final class EventHelper {
         return true;
     }
 
-}
+}
\ No newline at end of file