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 2019/10/29 15:30:15 UTC

[camel] 01/02: CAMEL-10955: Added events for camel starting and stopping routes so you have events for just that.

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 ec4743a613b965f771e9b9590856d5350d57658b
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Tue Oct 29 14:50:30 2019 +0100

    CAMEL-10955: Added events for camel starting and stopping routes so you have events for just that.
---
 .../camel/cdi/test/CamelEventEndpointTest.java     | 65 ---------------
 .../main/java/org/apache/camel/spi/CamelEvent.java | 32 ++++++++
 .../java/org/apache/camel/spi/EventFactory.java    | 32 ++++++++
 .../camel/impl/engine/AbstractCamelContext.java    |  5 ++
 .../impl/event/CamelContextRoutesStartedEvent.java | 33 ++++++++
 .../event/CamelContextRoutesStartingEvent.java     | 33 ++++++++
 .../impl/event/CamelContextRoutesStoppedEvent.java | 33 ++++++++
 .../event/CamelContextRoutesStoppingEvent.java     | 33 ++++++++
 .../camel/impl/event/DefaultEventFactory.java      | 20 +++++
 .../camel/impl/event/EventNotifierEventsTest.java  | 92 ++++++++++++----------
 .../EventNotifierFailureHandledEventsTest.java     | 90 +++++++++++----------
 ...ventNotifierServiceStoppingFailedEventTest.java | 14 ++--
 .../event/MultipleEventNotifierEventsTest.java     | 68 +++++++++-------
 .../camel/management/RemoveEventNotifierTest.java  |  4 +-
 .../java/org/apache/camel/support/EventHelper.java | 24 ++++++
 15 files changed, 394 insertions(+), 184 deletions(-)

diff --git a/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/CamelEventEndpointTest.java b/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/CamelEventEndpointTest.java
index 2217c09..252e571 100644
--- a/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/CamelEventEndpointTest.java
+++ b/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/CamelEventEndpointTest.java
@@ -17,7 +17,6 @@
 package org.apache.camel.cdi.test;
 
 import java.util.EventObject;
-
 import javax.inject.Inject;
 
 import org.apache.camel.builder.RouteBuilder;
@@ -26,11 +25,6 @@ import org.apache.camel.cdi.CdiEventEndpoint;
 import org.apache.camel.cdi.Uri;
 import org.apache.camel.component.mock.MockEndpoint;
 import org.apache.camel.spi.CamelEvent.CamelContextStartedEvent;
-import org.apache.camel.spi.CamelEvent.ExchangeCompletedEvent;
-import org.apache.camel.spi.CamelEvent.ExchangeCreatedEvent;
-import org.apache.camel.spi.CamelEvent.ExchangeSendingEvent;
-import org.apache.camel.spi.CamelEvent.ExchangeSentEvent;
-import org.apache.camel.spi.CamelEvent.RouteStartedEvent;
 import org.jboss.arquillian.container.test.api.Deployment;
 import org.jboss.arquillian.junit.Arquillian;
 import org.jboss.shrinkwrap.api.Archive;
@@ -41,7 +35,6 @@ import org.junit.Test;
 import org.junit.runner.RunWith;
 
 import static org.hamcrest.Matchers.contains;
-import static org.hamcrest.Matchers.either;
 import static org.hamcrest.Matchers.hasProperty;
 import static org.hamcrest.Matchers.instanceOf;
 import static org.junit.Assert.assertThat;
@@ -68,64 +61,6 @@ public class CamelEventEndpointTest {
                     hasProperty("body", instanceOf(CamelContextStartedEvent.class)))));
     }
 
-    @Test
-    public void camelAllEvents(@Uri("mock:events") MockEndpoint events) {
-        assertThat("Events fired are incorrect!", events.getExchanges(),
-            // We cannot rely on the delivery order of the camel context started event being fired and observed by both CDI event endpoints
-            either(
-                contains(
-                    // Started route: route1
-                    hasProperty("in", hasProperty("body", instanceOf(ExchangeCreatedEvent.class))),
-                    hasProperty("in", hasProperty("body", instanceOf(ExchangeSendingEvent.class))),
-                    hasProperty("in", hasProperty("body", instanceOf(RouteStartedEvent.class))),
-                    hasProperty("in", hasProperty("body", instanceOf(ExchangeSentEvent.class))),
-                    hasProperty("in", hasProperty("body", instanceOf(ExchangeCompletedEvent.class))),
-                    // Started route: route2
-                    hasProperty("in", hasProperty("body", instanceOf(ExchangeCreatedEvent.class))),
-                    hasProperty("in", hasProperty("body", instanceOf(ExchangeSendingEvent.class))),
-                    hasProperty("in", hasProperty("body", instanceOf(RouteStartedEvent.class))),
-                    hasProperty("in", hasProperty("body", instanceOf(ExchangeSentEvent.class))),
-                    hasProperty("in", hasProperty("body", instanceOf(ExchangeCompletedEvent.class))),
-                    // Started CamelContext: camel-cdi
-                    hasProperty("in", hasProperty("body", instanceOf(ExchangeCreatedEvent.class))),
-                    hasProperty("in", hasProperty("body", instanceOf(ExchangeSendingEvent.class))),
-                    hasProperty("in", hasProperty("body", instanceOf(CamelContextStartedEvent.class))),
-                    hasProperty("in", hasProperty("body", instanceOf(ExchangeSentEvent.class))),
-                    hasProperty("in", hasProperty("body", instanceOf(ExchangeCompletedEvent.class))),
-                    // Started CamelContext: camel-cdi (for CdiEventEndpoint<CamelContextStartedEvent> started)
-                    hasProperty("in", hasProperty("body", instanceOf(ExchangeCreatedEvent.class))),
-                    hasProperty("in", hasProperty("body", instanceOf(ExchangeSendingEvent.class))),
-                    hasProperty("in", hasProperty("body", instanceOf(ExchangeSentEvent.class))),
-                    hasProperty("in", hasProperty("body", instanceOf(ExchangeCompletedEvent.class)))
-            )).or(
-                contains(
-                    // Started route: route1
-                    hasProperty("in", hasProperty("body", instanceOf(ExchangeCreatedEvent.class))),
-                    hasProperty("in", hasProperty("body", instanceOf(ExchangeSendingEvent.class))),
-                    hasProperty("in", hasProperty("body", instanceOf(RouteStartedEvent.class))),
-                    hasProperty("in", hasProperty("body", instanceOf(ExchangeSentEvent.class))),
-                    hasProperty("in", hasProperty("body", instanceOf(ExchangeCompletedEvent.class))),
-                    // Started route: route2
-                    hasProperty("in", hasProperty("body", instanceOf(ExchangeCreatedEvent.class))),
-                    hasProperty("in", hasProperty("body", instanceOf(ExchangeSendingEvent.class))),
-                    hasProperty("in", hasProperty("body", instanceOf(RouteStartedEvent.class))),
-                    hasProperty("in", hasProperty("body", instanceOf(ExchangeSentEvent.class))),
-                    hasProperty("in", hasProperty("body", instanceOf(ExchangeCompletedEvent.class))),
-                    // Started CamelContext: camel-cdi (for CdiEventEndpoint<CamelContextStartedEvent> started)
-                    hasProperty("in", hasProperty("body", instanceOf(ExchangeCreatedEvent.class))),
-                    hasProperty("in", hasProperty("body", instanceOf(ExchangeSendingEvent.class))),
-                    hasProperty("in", hasProperty("body", instanceOf(ExchangeSentEvent.class))),
-                    hasProperty("in", hasProperty("body", instanceOf(ExchangeCompletedEvent.class))),
-                    // Started CamelContext: camel-cdi
-                    hasProperty("in", hasProperty("body", instanceOf(ExchangeCreatedEvent.class))),
-                    hasProperty("in", hasProperty("body", instanceOf(ExchangeSendingEvent.class))),
-                    hasProperty("in", hasProperty("body", instanceOf(CamelContextStartedEvent.class))),
-                    hasProperty("in", hasProperty("body", instanceOf(ExchangeSentEvent.class))),
-                    hasProperty("in", hasProperty("body", instanceOf(ExchangeCompletedEvent.class)))
-                )
-            )
-        );
-    }
 }
 
 class CamelEventRoute extends RouteBuilder {
diff --git a/core/camel-api/src/main/java/org/apache/camel/spi/CamelEvent.java b/core/camel-api/src/main/java/org/apache/camel/spi/CamelEvent.java
index 91879a4..7ce2bb8 100644
--- a/core/camel-api/src/main/java/org/apache/camel/spi/CamelEvent.java
+++ b/core/camel-api/src/main/java/org/apache/camel/spi/CamelEvent.java
@@ -39,6 +39,10 @@ public interface CamelEvent {
         CamelContextStopping,
         CamelContextSuspended,
         CamelContextSuspending,
+        CamelContextRoutesStarting,
+        CamelContextRoutesStarted,
+        CamelContextRoutesStopping,
+        CamelContextRoutesStopped,
         ExchangeCompleted,
         ExchangeCreated,
         ExchangeFailed,
@@ -161,6 +165,34 @@ public interface CamelEvent {
         }
     }
 
+    interface CamelContextRoutesStartingEvent extends CamelContextEvent {
+        @Override
+        default Type getType() {
+            return Type.CamelContextRoutesStarting;
+        }
+    }
+
+    interface CamelContextRoutesStartedEvent extends CamelContextEvent {
+        @Override
+        default Type getType() {
+            return Type.CamelContextRoutesStarted;
+        }
+    }
+
+    interface CamelContextRoutesStoppingEvent extends CamelContextEvent {
+        @Override
+        default Type getType() {
+            return Type.CamelContextRoutesStopping;
+        }
+    }
+
+    interface CamelContextRoutesStoppedEvent extends CamelContextEvent {
+        @Override
+        default Type getType() {
+            return Type.CamelContextRoutesStopped;
+        }
+    }
+
     interface ExchangeEvent extends CamelEvent {
 
         Exchange getExchange();
diff --git a/core/camel-api/src/main/java/org/apache/camel/spi/EventFactory.java b/core/camel-api/src/main/java/org/apache/camel/spi/EventFactory.java
index f422ad3..41754e7 100644
--- a/core/camel-api/src/main/java/org/apache/camel/spi/EventFactory.java
+++ b/core/camel-api/src/main/java/org/apache/camel/spi/EventFactory.java
@@ -80,6 +80,38 @@ public interface EventFactory {
     CamelEvent createCamelContextStoppedEvent(CamelContext context);
 
     /**
+     * Creates an {@link CamelEvent} for Camel routes starting.
+     *
+     * @param context camel context
+     * @return the created event
+     */
+    CamelEvent createCamelContextRoutesStartingEvent(CamelContext context);
+
+    /**
+     * Creates an {@link CamelEvent} for Camel routes started.
+     *
+     * @param context camel context
+     * @return the created event
+     */
+    CamelEvent createCamelContextRoutesStartedEvent(CamelContext context);
+
+    /**
+     * Creates an {@link CamelEvent} for Camel routes stopping.
+     *
+     * @param context camel context
+     * @return the created event
+     */
+    CamelEvent createCamelContextRoutesStoppingEvent(CamelContext context);
+
+    /**
+     * Creates an {@link CamelEvent} for Camel routes stopped.
+     *
+     * @param context camel context
+     * @return the created event
+     */
+    CamelEvent createCamelContextRoutesStoppedEvent(CamelContext context);
+
+    /**
      * Creates an {@link CamelEvent} for a Service failed to start cleanly
      *
      * @param context camel context
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
index 41af8a8..69e0453 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
@@ -2629,7 +2629,9 @@ public abstract class AbstractCamelContext extends ServiceSupport implements Ext
         }
 
         // invoke this logic to warmup the routes and if possible also start the routes
+        EventHelper.notifyCamelContextRoutesStarting(this);
         doStartOrResumeRoutes(routeServices, true, !doNotStartRoutesOnFirstStart, false, true);
+        EventHelper.notifyCamelContextRoutesStarted(this);
 
         long cacheCounter = getBeanIntrospection().getCachedClassesCounter();
         if (cacheCounter > 0) {
@@ -2655,6 +2657,7 @@ public abstract class AbstractCamelContext extends ServiceSupport implements Ext
         stopWatch.restart();
         log.info("Apache Camel {} (CamelContext: {}) is shutting down", getVersion(), getName());
         EventHelper.notifyCamelContextStopping(this);
+        EventHelper.notifyCamelContextRoutesStopping(this);
 
         // Stop the route controller
         ServiceHelper.stopAndShutdownService(this.routeController);
@@ -2695,6 +2698,8 @@ public abstract class AbstractCamelContext extends ServiceSupport implements Ext
         // Camel again and get the route back as before
         routeStartupOrder.clear();
 
+        EventHelper.notifyCamelContextRoutesStopped(this);
+
         // but clear any suspend routes
         suspendedRouteServices.clear();
 
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/event/CamelContextRoutesStartedEvent.java b/core/camel-base/src/main/java/org/apache/camel/impl/event/CamelContextRoutesStartedEvent.java
new file mode 100644
index 0000000..cded744
--- /dev/null
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/event/CamelContextRoutesStartedEvent.java
@@ -0,0 +1,33 @@
+/*
+ * 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.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.impl.event;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.spi.CamelEvent;
+
+public class CamelContextRoutesStartedEvent extends AbstractContextEvent implements CamelEvent.CamelContextRoutesStartedEvent {
+    private static final long serialVersionUID = -1120225323715688981L;
+
+    public CamelContextRoutesStartedEvent(CamelContext source) {
+        super(source);
+    }
+
+    @Override
+    public String toString() {
+        return "Started routes on CamelContext: " + getContext().getName();
+    }
+}
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/event/CamelContextRoutesStartingEvent.java b/core/camel-base/src/main/java/org/apache/camel/impl/event/CamelContextRoutesStartingEvent.java
new file mode 100644
index 0000000..76a0e60
--- /dev/null
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/event/CamelContextRoutesStartingEvent.java
@@ -0,0 +1,33 @@
+/*
+ * 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.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.impl.event;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.spi.CamelEvent;
+
+public class CamelContextRoutesStartingEvent extends AbstractContextEvent implements CamelEvent.CamelContextRoutesStartingEvent {
+    private static final long serialVersionUID = -1120225323715688981L;
+
+    public CamelContextRoutesStartingEvent(CamelContext source) {
+        super(source);
+    }
+
+    @Override
+    public String toString() {
+        return "Starting routes on CamelContext: " + getContext().getName();
+    }
+}
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/event/CamelContextRoutesStoppedEvent.java b/core/camel-base/src/main/java/org/apache/camel/impl/event/CamelContextRoutesStoppedEvent.java
new file mode 100644
index 0000000..7c37a5b
--- /dev/null
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/event/CamelContextRoutesStoppedEvent.java
@@ -0,0 +1,33 @@
+/*
+ * 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.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.impl.event;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.spi.CamelEvent;
+
+public class CamelContextRoutesStoppedEvent extends AbstractContextEvent implements CamelEvent.CamelContextRoutesStoppedEvent {
+    private static final long serialVersionUID = -1120225323715688981L;
+
+    public CamelContextRoutesStoppedEvent(CamelContext source) {
+        super(source);
+    }
+
+    @Override
+    public String toString() {
+        return "Stopped routes on CamelContext: " + getContext().getName();
+    }
+}
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/event/CamelContextRoutesStoppingEvent.java b/core/camel-base/src/main/java/org/apache/camel/impl/event/CamelContextRoutesStoppingEvent.java
new file mode 100644
index 0000000..8e80ced
--- /dev/null
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/event/CamelContextRoutesStoppingEvent.java
@@ -0,0 +1,33 @@
+/*
+ * 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.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.impl.event;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.spi.CamelEvent;
+
+public class CamelContextRoutesStoppingEvent extends AbstractContextEvent implements CamelEvent.CamelContextRoutesStoppingEvent {
+    private static final long serialVersionUID = -1120225323715688981L;
+
+    public CamelContextRoutesStoppingEvent(CamelContext source) {
+        super(source);
+    }
+
+    @Override
+    public String toString() {
+        return "Stopping routes on CamelContext: " + getContext().getName();
+    }
+}
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/event/DefaultEventFactory.java b/core/camel-base/src/main/java/org/apache/camel/impl/event/DefaultEventFactory.java
index 22bc64e..7729788 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/event/DefaultEventFactory.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/event/DefaultEventFactory.java
@@ -51,6 +51,26 @@ public class DefaultEventFactory implements EventFactory {
     }
 
     @Override
+    public CamelEvent createCamelContextRoutesStartingEvent(CamelContext context) {
+        return new CamelContextRoutesStartingEvent(context);
+    }
+
+    @Override
+    public CamelEvent createCamelContextRoutesStartedEvent(CamelContext context) {
+        return new CamelContextRoutesStartedEvent(context);
+    }
+
+    @Override
+    public CamelEvent createCamelContextRoutesStoppingEvent(CamelContext context) {
+        return new CamelContextRoutesStoppingEvent(context);
+    }
+
+    @Override
+    public CamelEvent createCamelContextRoutesStoppedEvent(CamelContext context) {
+        return new CamelContextRoutesStoppedEvent(context);
+    }
+
+    @Override
     public CamelEvent createCamelContextStartupFailureEvent(CamelContext context, Throwable cause) {
         return new CamelContextStartupFailureEvent(context, cause);
     }
diff --git a/core/camel-core/src/test/java/org/apache/camel/impl/event/EventNotifierEventsTest.java b/core/camel-core/src/test/java/org/apache/camel/impl/event/EventNotifierEventsTest.java
index 644c769..a2aee4d 100644
--- a/core/camel-core/src/test/java/org/apache/camel/impl/event/EventNotifierEventsTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/impl/event/EventNotifierEventsTest.java
@@ -58,30 +58,36 @@ public class EventNotifierEventsTest extends ContextTestSupport {
 
         assertMockEndpointsSatisfied();
 
-        assertEquals(14, events.size());
+        assertEquals(16, events.size());
         assertIsInstanceOf(CamelContextStartingEvent.class, events.get(0));
-        assertIsInstanceOf(RouteAddedEvent.class, events.get(1));
+        assertIsInstanceOf(CamelContextRoutesStartingEvent.class, events.get(1));
         assertIsInstanceOf(RouteAddedEvent.class, events.get(2));
-        assertIsInstanceOf(RouteStartedEvent.class, events.get(3));
+        assertIsInstanceOf(RouteAddedEvent.class, events.get(3));
         assertIsInstanceOf(RouteStartedEvent.class, events.get(4));
-        assertIsInstanceOf(CamelContextStartedEvent.class, events.get(5));
-        assertIsInstanceOf(ExchangeCreatedEvent.class, events.get(7));
-        assertIsInstanceOf(ExchangeSentEvent.class, events.get(9));
+        assertIsInstanceOf(RouteStartedEvent.class, events.get(5));
+        assertIsInstanceOf(CamelContextRoutesStartedEvent.class, events.get(6));
+        assertIsInstanceOf(CamelContextStartedEvent.class, events.get(7));
+        assertIsInstanceOf(ExchangeCreatedEvent.class, events.get(9));
+        assertIsInstanceOf(ExchangeSendingEvent.class, events.get(10));
         assertIsInstanceOf(ExchangeSentEvent.class, events.get(11));
-        assertIsInstanceOf(ExchangeCompletedEvent.class, events.get(12));
+        assertIsInstanceOf(ExchangeSendingEvent.class, events.get(12));
+        assertIsInstanceOf(ExchangeSentEvent.class, events.get(13));
+        assertIsInstanceOf(ExchangeCompletedEvent.class, events.get(14));
 
         // this is the sent using the produce template to start the test
-        assertIsInstanceOf(ExchangeSentEvent.class, events.get(13));
+        assertIsInstanceOf(ExchangeSentEvent.class, events.get(15));
 
         context.stop();
 
-        assertEquals(20, events.size());
-        assertIsInstanceOf(CamelContextStoppingEvent.class, events.get(14));
-        assertIsInstanceOf(RouteStoppedEvent.class, events.get(15));
-        assertIsInstanceOf(RouteRemovedEvent.class, events.get(16));
-        assertIsInstanceOf(RouteStoppedEvent.class, events.get(17));
-        assertIsInstanceOf(RouteRemovedEvent.class, events.get(18));
-        assertIsInstanceOf(CamelContextStoppedEvent.class, events.get(19));
+        assertEquals(24, events.size());
+        assertIsInstanceOf(CamelContextStoppingEvent.class, events.get(16));
+        assertIsInstanceOf(CamelContextRoutesStoppingEvent.class, events.get(17));
+        assertIsInstanceOf(RouteStoppedEvent.class, events.get(18));
+        assertIsInstanceOf(RouteRemovedEvent.class, events.get(19));
+        assertIsInstanceOf(RouteStoppedEvent.class, events.get(20));
+        assertIsInstanceOf(RouteRemovedEvent.class, events.get(21));
+        assertIsInstanceOf(CamelContextRoutesStoppedEvent.class, events.get(22));
+        assertIsInstanceOf(CamelContextStoppedEvent.class, events.get(23));
     }
 
     @Test
@@ -94,52 +100,58 @@ public class EventNotifierEventsTest extends ContextTestSupport {
             assertIsInstanceOf(IllegalArgumentException.class, e.getCause());
         }
 
-        assertEquals(10, events.size());
+        assertEquals(12, events.size());
         assertIsInstanceOf(CamelContextStartingEvent.class, events.get(0));
-        assertIsInstanceOf(RouteAddedEvent.class, events.get(1));
+        assertIsInstanceOf(CamelContextRoutesStartingEvent.class, events.get(1));
         assertIsInstanceOf(RouteAddedEvent.class, events.get(2));
-        assertIsInstanceOf(RouteStartedEvent.class, events.get(3));
+        assertIsInstanceOf(RouteAddedEvent.class, events.get(3));
         assertIsInstanceOf(RouteStartedEvent.class, events.get(4));
-        assertIsInstanceOf(CamelContextStartedEvent.class, events.get(5));
-        assertIsInstanceOf(ExchangeSendingEvent.class, events.get(6));
-        assertIsInstanceOf(ExchangeCreatedEvent.class, events.get(7));
-        assertIsInstanceOf(ExchangeFailedEvent.class, events.get(8));
+        assertIsInstanceOf(RouteStartedEvent.class, events.get(5));
+        assertIsInstanceOf(CamelContextRoutesStartedEvent.class, events.get(6));
+        assertIsInstanceOf(CamelContextStartedEvent.class, events.get(7));
+        assertIsInstanceOf(ExchangeSendingEvent.class, events.get(8));
+        assertIsInstanceOf(ExchangeCreatedEvent.class, events.get(9));
+        assertIsInstanceOf(ExchangeFailedEvent.class, events.get(10));
         // this is the sent using the produce template to start the test
-        assertIsInstanceOf(ExchangeSentEvent.class, events.get(9));
+        assertIsInstanceOf(ExchangeSentEvent.class, events.get(11));
 
         context.stop();
 
-        assertEquals(16, events.size());
-        assertIsInstanceOf(CamelContextStoppingEvent.class, events.get(10));
-        assertIsInstanceOf(RouteStoppedEvent.class, events.get(11));
-        assertIsInstanceOf(RouteRemovedEvent.class, events.get(12));
-        assertIsInstanceOf(RouteStoppedEvent.class, events.get(13));
-        assertIsInstanceOf(RouteRemovedEvent.class, events.get(14));
-        assertIsInstanceOf(CamelContextStoppedEvent.class, events.get(15));
+        assertEquals(20, events.size());
+        assertIsInstanceOf(CamelContextStoppingEvent.class, events.get(12));
+        assertIsInstanceOf(CamelContextRoutesStoppingEvent.class, events.get(13));
+        assertIsInstanceOf(RouteStoppedEvent.class, events.get(14));
+        assertIsInstanceOf(RouteRemovedEvent.class, events.get(15));
+        assertIsInstanceOf(RouteStoppedEvent.class, events.get(16));
+        assertIsInstanceOf(RouteRemovedEvent.class, events.get(17));
+        assertIsInstanceOf(CamelContextRoutesStoppedEvent.class, events.get(18));
+        assertIsInstanceOf(CamelContextStoppedEvent.class, events.get(19));
     }
 
     @Test
     public void testSuspendResume() throws Exception {
-        assertEquals(6, events.size());
+        assertEquals(8, events.size());
         assertIsInstanceOf(CamelContextStartingEvent.class, events.get(0));
-        assertIsInstanceOf(RouteAddedEvent.class, events.get(1));
+        assertIsInstanceOf(CamelContextRoutesStartingEvent.class, events.get(1));
         assertIsInstanceOf(RouteAddedEvent.class, events.get(2));
-        assertIsInstanceOf(RouteStartedEvent.class, events.get(3));
+        assertIsInstanceOf(RouteAddedEvent.class, events.get(3));
         assertIsInstanceOf(RouteStartedEvent.class, events.get(4));
-        assertIsInstanceOf(CamelContextStartedEvent.class, events.get(5));
+        assertIsInstanceOf(RouteStartedEvent.class, events.get(5));
+        assertIsInstanceOf(CamelContextRoutesStartedEvent.class, events.get(6));
+        assertIsInstanceOf(CamelContextStartedEvent.class, events.get(7));
 
         context.suspend();
 
-        assertEquals(8, events.size());
-        assertIsInstanceOf(CamelContextSuspendingEvent.class, events.get(6));
+        assertEquals(10, events.size());
+        assertIsInstanceOf(CamelContextSuspendingEvent.class, events.get(8));
         // notice direct component is not suspended (as they are internal)
-        assertIsInstanceOf(CamelContextSuspendedEvent.class, events.get(7));
+        assertIsInstanceOf(CamelContextSuspendedEvent.class, events.get(9));
 
         context.resume();
 
-        assertEquals(10, events.size());
-        assertIsInstanceOf(CamelContextResumingEvent.class, events.get(8));
-        assertIsInstanceOf(CamelContextResumedEvent.class, events.get(9));
+        assertEquals(12, events.size());
+        assertIsInstanceOf(CamelContextResumingEvent.class, events.get(10));
+        assertIsInstanceOf(CamelContextResumedEvent.class, events.get(11));
     }
 
     @Override
diff --git a/core/camel-core/src/test/java/org/apache/camel/impl/event/EventNotifierFailureHandledEventsTest.java b/core/camel-core/src/test/java/org/apache/camel/impl/event/EventNotifierFailureHandledEventsTest.java
index 7312898..ca5e0a0 100644
--- a/core/camel-core/src/test/java/org/apache/camel/impl/event/EventNotifierFailureHandledEventsTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/impl/event/EventNotifierFailureHandledEventsTest.java
@@ -74,22 +74,24 @@ public class EventNotifierFailureHandledEventsTest extends ContextTestSupport {
         template.sendBody("direct:start", "Hello World");
         assertMockEndpointsSatisfied();
 
-        assertEquals(12, events.size());
+        assertEquals(14, events.size());
         assertIsInstanceOf(CamelContextStartingEvent.class, events.get(0));
-        assertIsInstanceOf(RouteAddedEvent.class, events.get(1));
-        assertIsInstanceOf(RouteStartedEvent.class, events.get(2));
-        assertIsInstanceOf(CamelContextStartedEvent.class, events.get(3));
-        assertIsInstanceOf(ExchangeSendingEvent.class, events.get(4));
-        assertIsInstanceOf(ExchangeCreatedEvent.class, events.get(5));
-
-        ExchangeFailureHandlingEvent e0 = assertIsInstanceOf(ExchangeFailureHandlingEvent.class, events.get(6));
+        assertIsInstanceOf(CamelContextRoutesStartingEvent.class, events.get(1));
+        assertIsInstanceOf(RouteAddedEvent.class, events.get(2));
+        assertIsInstanceOf(RouteStartedEvent.class, events.get(3));
+        assertIsInstanceOf(CamelContextRoutesStartedEvent.class, events.get(4));
+        assertIsInstanceOf(CamelContextStartedEvent.class, events.get(5));
+        assertIsInstanceOf(ExchangeSendingEvent.class, events.get(6));
+        assertIsInstanceOf(ExchangeCreatedEvent.class, events.get(7));
+
+        ExchangeFailureHandlingEvent e0 = assertIsInstanceOf(ExchangeFailureHandlingEvent.class, events.get(8));
         assertEquals("should be DLC", true, e0.isDeadLetterChannel());
         assertEquals("mock://dead", e0.getDeadLetterUri());
 
-        assertIsInstanceOf(ExchangeSendingEvent.class, events.get(7));
-        assertIsInstanceOf(ExchangeSentEvent.class, events.get(8));
+        assertIsInstanceOf(ExchangeSendingEvent.class, events.get(9));
+        assertIsInstanceOf(ExchangeSentEvent.class, events.get(10));
 
-        ExchangeFailureHandledEvent e = assertIsInstanceOf(ExchangeFailureHandledEvent.class, events.get(9));
+        ExchangeFailureHandledEvent e = assertIsInstanceOf(ExchangeFailureHandledEvent.class, events.get(11));
         assertEquals("should be DLC", true, e.isDeadLetterChannel());
         assertTrue("should be marked as failure handled", e.isHandled());
         assertFalse("should not be continued", e.isContinued());
@@ -102,10 +104,10 @@ public class EventNotifierFailureHandledEventsTest extends ContextTestSupport {
         assertEquals("mock://dead", e.getDeadLetterUri());
 
         // dead letter channel will mark the exchange as completed
-        assertIsInstanceOf(ExchangeCompletedEvent.class, events.get(10));
+        assertIsInstanceOf(ExchangeCompletedEvent.class, events.get(12));
         // and the last event should be the direct:start
-        assertIsInstanceOf(ExchangeSentEvent.class, events.get(11));
-        ExchangeSentEvent sent = (ExchangeSentEvent)events.get(11);
+        assertIsInstanceOf(ExchangeSentEvent.class, events.get(13));
+        ExchangeSentEvent sent = (ExchangeSentEvent)events.get(13);
         assertEquals("direct://start", sent.getEndpoint().getEndpointUri());
     }
 
@@ -125,30 +127,32 @@ public class EventNotifierFailureHandledEventsTest extends ContextTestSupport {
         template.sendBody("direct:start", "Hello World");
         assertMockEndpointsSatisfied();
 
-        assertEquals(12, events.size());
+        assertEquals(14, events.size());
         assertIsInstanceOf(CamelContextStartingEvent.class, events.get(0));
-        assertIsInstanceOf(RouteAddedEvent.class, events.get(1));
-        assertIsInstanceOf(RouteStartedEvent.class, events.get(2));
-        assertIsInstanceOf(CamelContextStartedEvent.class, events.get(3));
-        assertIsInstanceOf(ExchangeSendingEvent.class, events.get(4));
-        assertIsInstanceOf(ExchangeCreatedEvent.class, events.get(5));
-
-        ExchangeFailureHandlingEvent e0 = assertIsInstanceOf(ExchangeFailureHandlingEvent.class, events.get(6));
+        assertIsInstanceOf(CamelContextRoutesStartingEvent.class, events.get(1));
+        assertIsInstanceOf(RouteAddedEvent.class, events.get(2));
+        assertIsInstanceOf(RouteStartedEvent.class, events.get(3));
+        assertIsInstanceOf(CamelContextRoutesStartedEvent.class, events.get(4));
+        assertIsInstanceOf(CamelContextStartedEvent.class, events.get(5));
+        assertIsInstanceOf(ExchangeSendingEvent.class, events.get(6));
+        assertIsInstanceOf(ExchangeCreatedEvent.class, events.get(7));
+
+        ExchangeFailureHandlingEvent e0 = assertIsInstanceOf(ExchangeFailureHandlingEvent.class, events.get(8));
         assertEquals("should NOT be DLC", false, e0.isDeadLetterChannel());
 
-        assertIsInstanceOf(ExchangeSendingEvent.class, events.get(7));
-        assertIsInstanceOf(ExchangeSentEvent.class, events.get(8));
+        assertIsInstanceOf(ExchangeSendingEvent.class, events.get(9));
+        assertIsInstanceOf(ExchangeSentEvent.class, events.get(10));
 
-        ExchangeFailureHandledEvent e = assertIsInstanceOf(ExchangeFailureHandledEvent.class, events.get(9));
+        ExchangeFailureHandledEvent e = assertIsInstanceOf(ExchangeFailureHandledEvent.class, events.get(11));
         assertEquals("should NOT be DLC", false, e.isDeadLetterChannel());
         assertTrue("should be marked as failure handled", e.isHandled());
         assertFalse("should not be continued", e.isContinued());
 
         // onException will handle the exception
-        assertIsInstanceOf(ExchangeCompletedEvent.class, events.get(10));
+        assertIsInstanceOf(ExchangeCompletedEvent.class, events.get(12));
         // and the last event should be the direct:start
-        assertIsInstanceOf(ExchangeSentEvent.class, events.get(11));
-        ExchangeSentEvent sent = (ExchangeSentEvent)events.get(11);
+        assertIsInstanceOf(ExchangeSentEvent.class, events.get(13));
+        ExchangeSentEvent sent = (ExchangeSentEvent)events.get(13);
         assertEquals("direct://start", sent.getEndpoint().getEndpointUri());
     }
 
@@ -166,30 +170,32 @@ public class EventNotifierFailureHandledEventsTest extends ContextTestSupport {
         template.sendBody("direct:start", "Hello World");
         assertMockEndpointsSatisfied();
 
-        assertEquals(12, events.size());
+        assertEquals(14, events.size());
         assertIsInstanceOf(CamelContextStartingEvent.class, events.get(0));
-        assertIsInstanceOf(RouteAddedEvent.class, events.get(1));
-        assertIsInstanceOf(RouteStartedEvent.class, events.get(2));
-        assertIsInstanceOf(CamelContextStartedEvent.class, events.get(3));
-        assertIsInstanceOf(ExchangeSendingEvent.class, events.get(4));
-        assertIsInstanceOf(ExchangeCreatedEvent.class, events.get(5));
-
-        ExchangeFailureHandlingEvent e0 = assertIsInstanceOf(ExchangeFailureHandlingEvent.class, events.get(6));
+        assertIsInstanceOf(CamelContextRoutesStartingEvent.class, events.get(1));
+        assertIsInstanceOf(RouteAddedEvent.class, events.get(2));
+        assertIsInstanceOf(RouteStartedEvent.class, events.get(3));
+        assertIsInstanceOf(CamelContextRoutesStartedEvent.class, events.get(4));
+        assertIsInstanceOf(CamelContextStartedEvent.class, events.get(5));
+        assertIsInstanceOf(ExchangeSendingEvent.class, events.get(6));
+        assertIsInstanceOf(ExchangeCreatedEvent.class, events.get(7));
+
+        ExchangeFailureHandlingEvent e0 = assertIsInstanceOf(ExchangeFailureHandlingEvent.class, events.get(8));
         assertEquals("should NOT be DLC", false, e0.isDeadLetterChannel());
 
-        assertIsInstanceOf(ExchangeSendingEvent.class, events.get(7));
-        assertIsInstanceOf(ExchangeSentEvent.class, events.get(8));
+        assertIsInstanceOf(ExchangeSendingEvent.class, events.get(9));
+        assertIsInstanceOf(ExchangeSentEvent.class, events.get(10));
 
-        ExchangeFailureHandledEvent e = assertIsInstanceOf(ExchangeFailureHandledEvent.class, events.get(9));
+        ExchangeFailureHandledEvent e = assertIsInstanceOf(ExchangeFailureHandledEvent.class, events.get(11));
         assertEquals("should NOT be DLC", false, e.isDeadLetterChannel());
         assertFalse("should not be marked as failure handled as it was continued instead", e.isHandled());
         assertTrue("should be continued", e.isContinued());
 
         // onException will handle the exception
-        assertIsInstanceOf(ExchangeCompletedEvent.class, events.get(10));
+        assertIsInstanceOf(ExchangeCompletedEvent.class, events.get(12));
         // and the last event should be the direct:start
-        assertIsInstanceOf(ExchangeSentEvent.class, events.get(11));
-        ExchangeSentEvent sent = (ExchangeSentEvent)events.get(11);
+        assertIsInstanceOf(ExchangeSentEvent.class, events.get(13));
+        ExchangeSentEvent sent = (ExchangeSentEvent)events.get(13);
         assertEquals("direct://start", sent.getEndpoint().getEndpointUri());
     }
 
diff --git a/core/camel-core/src/test/java/org/apache/camel/impl/event/EventNotifierServiceStoppingFailedEventTest.java b/core/camel-core/src/test/java/org/apache/camel/impl/event/EventNotifierServiceStoppingFailedEventTest.java
index e7bf382..ab5dc6e 100644
--- a/core/camel-core/src/test/java/org/apache/camel/impl/event/EventNotifierServiceStoppingFailedEventTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/impl/event/EventNotifierServiceStoppingFailedEventTest.java
@@ -63,13 +63,17 @@ public class EventNotifierServiceStoppingFailedEventTest extends ContextTestSupp
 
         assertEquals("CBA", stopOrder);
 
-        assertEquals(5, events.size());
+        assertEquals(9, events.size());
 
         assertIsInstanceOf(CamelContextStartingEvent.class, events.get(0));
-        assertIsInstanceOf(CamelContextStartedEvent.class, events.get(1));
-        assertIsInstanceOf(CamelContextStoppingEvent.class, events.get(2));
-        ServiceStopFailureEvent event = assertIsInstanceOf(ServiceStopFailureEvent.class, events.get(3));
-        assertIsInstanceOf(CamelContextStoppedEvent.class, events.get(4));
+        assertIsInstanceOf(CamelContextRoutesStartingEvent.class, events.get(1));
+        assertIsInstanceOf(CamelContextRoutesStartedEvent.class, events.get(2));
+        assertIsInstanceOf(CamelContextStartedEvent.class, events.get(3));
+        assertIsInstanceOf(CamelContextStoppingEvent.class, events.get(4));
+        assertIsInstanceOf(CamelContextRoutesStoppingEvent.class, events.get(5));
+        assertIsInstanceOf(CamelContextRoutesStoppedEvent.class, events.get(6));
+        ServiceStopFailureEvent event = assertIsInstanceOf(ServiceStopFailureEvent.class, events.get(7));
+        assertIsInstanceOf(CamelContextStoppedEvent.class, events.get(8));
 
         assertEquals("Fail B", event.getCause().getMessage());
         assertEquals("Failure to stop service: B due to Fail B", event.toString());
diff --git a/core/camel-core/src/test/java/org/apache/camel/impl/event/MultipleEventNotifierEventsTest.java b/core/camel-core/src/test/java/org/apache/camel/impl/event/MultipleEventNotifierEventsTest.java
index c959bb8..3e154e4 100644
--- a/core/camel-core/src/test/java/org/apache/camel/impl/event/MultipleEventNotifierEventsTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/impl/event/MultipleEventNotifierEventsTest.java
@@ -77,21 +77,23 @@ public class MultipleEventNotifierEventsTest extends ContextTestSupport {
 
         assertMockEndpointsSatisfied();
 
-        assertEquals(14, events.size());
+        assertEquals(16, events.size());
         assertIsInstanceOf(CamelContextStartingEvent.class, events.get(0));
-        assertIsInstanceOf(RouteAddedEvent.class, events.get(1));
+        assertIsInstanceOf(CamelContextRoutesStartingEvent.class, events.get(1));
         assertIsInstanceOf(RouteAddedEvent.class, events.get(2));
-        assertIsInstanceOf(RouteStartedEvent.class, events.get(3));
+        assertIsInstanceOf(RouteAddedEvent.class, events.get(3));
         assertIsInstanceOf(RouteStartedEvent.class, events.get(4));
-        assertIsInstanceOf(CamelContextStartedEvent.class, events.get(5));
-        assertIsInstanceOf(ExchangeSendingEvent.class, events.get(6));
-        assertIsInstanceOf(ExchangeCreatedEvent.class, events.get(7));
+        assertIsInstanceOf(RouteStartedEvent.class, events.get(5));
+        assertIsInstanceOf(CamelContextRoutesStartedEvent.class, events.get(6));
+        assertIsInstanceOf(CamelContextStartedEvent.class, events.get(7));
         assertIsInstanceOf(ExchangeSendingEvent.class, events.get(8));
-        assertIsInstanceOf(ExchangeSentEvent.class, events.get(9));
+        assertIsInstanceOf(ExchangeCreatedEvent.class, events.get(9));
         assertIsInstanceOf(ExchangeSendingEvent.class, events.get(10));
         assertIsInstanceOf(ExchangeSentEvent.class, events.get(11));
-        assertIsInstanceOf(ExchangeCompletedEvent.class, events.get(12));
+        assertIsInstanceOf(ExchangeSendingEvent.class, events.get(12));
         assertIsInstanceOf(ExchangeSentEvent.class, events.get(13));
+        assertIsInstanceOf(ExchangeCompletedEvent.class, events.get(14));
+        assertIsInstanceOf(ExchangeSentEvent.class, events.get(15));
 
         assertEquals(8, events2.size());
         assertIsInstanceOf(ExchangeSendingEvent.class, events2.get(0));
@@ -105,13 +107,15 @@ public class MultipleEventNotifierEventsTest extends ContextTestSupport {
 
         context.stop();
 
-        assertEquals(20, events.size());
-        assertIsInstanceOf(CamelContextStoppingEvent.class, events.get(14));
-        assertIsInstanceOf(RouteStoppedEvent.class, events.get(15));
-        assertIsInstanceOf(RouteRemovedEvent.class, events.get(16));
-        assertIsInstanceOf(RouteStoppedEvent.class, events.get(17));
-        assertIsInstanceOf(RouteRemovedEvent.class, events.get(18));
-        assertIsInstanceOf(CamelContextStoppedEvent.class, events.get(19));
+        assertEquals(24, events.size());
+        assertIsInstanceOf(CamelContextStoppingEvent.class, events.get(16));
+        assertIsInstanceOf(CamelContextRoutesStoppingEvent.class, events.get(17));
+        assertIsInstanceOf(RouteStoppedEvent.class, events.get(18));
+        assertIsInstanceOf(RouteRemovedEvent.class, events.get(19));
+        assertIsInstanceOf(RouteStoppedEvent.class, events.get(20));
+        assertIsInstanceOf(RouteRemovedEvent.class, events.get(21));
+        assertIsInstanceOf(CamelContextRoutesStoppedEvent.class, events.get(22));
+        assertIsInstanceOf(CamelContextStoppedEvent.class, events.get(23));
 
         assertEquals(8, events2.size());
     }
@@ -126,17 +130,19 @@ public class MultipleEventNotifierEventsTest extends ContextTestSupport {
             assertIsInstanceOf(IllegalArgumentException.class, e.getCause());
         }
 
-        assertEquals(10, events.size());
+        assertEquals(12, events.size());
         assertIsInstanceOf(CamelContextStartingEvent.class, events.get(0));
-        assertIsInstanceOf(RouteAddedEvent.class, events.get(1));
+        assertIsInstanceOf(CamelContextRoutesStartingEvent.class, events.get(1));
         assertIsInstanceOf(RouteAddedEvent.class, events.get(2));
-        assertIsInstanceOf(RouteStartedEvent.class, events.get(3));
+        assertIsInstanceOf(RouteAddedEvent.class, events.get(3));
         assertIsInstanceOf(RouteStartedEvent.class, events.get(4));
-        assertIsInstanceOf(CamelContextStartedEvent.class, events.get(5));
-        assertIsInstanceOf(ExchangeSendingEvent.class, events.get(6));
-        assertIsInstanceOf(ExchangeCreatedEvent.class, events.get(7));
-        assertIsInstanceOf(ExchangeFailedEvent.class, events.get(8));
-        assertIsInstanceOf(ExchangeSentEvent.class, events.get(9));
+        assertIsInstanceOf(RouteStartedEvent.class, events.get(5));
+        assertIsInstanceOf(CamelContextRoutesStartedEvent.class, events.get(6));
+        assertIsInstanceOf(CamelContextStartedEvent.class, events.get(7));
+        assertIsInstanceOf(ExchangeSendingEvent.class, events.get(8));
+        assertIsInstanceOf(ExchangeCreatedEvent.class, events.get(9));
+        assertIsInstanceOf(ExchangeFailedEvent.class, events.get(10));
+        assertIsInstanceOf(ExchangeSentEvent.class, events.get(11));
 
         assertEquals(4, events2.size());
 
@@ -146,13 +152,15 @@ public class MultipleEventNotifierEventsTest extends ContextTestSupport {
         assertIsInstanceOf(ExchangeFailedEvent.class, events2.get(2));
         assertIsInstanceOf(ExchangeSentEvent.class, events2.get(3));
 
-        assertEquals(16, events.size());
-        assertIsInstanceOf(CamelContextStoppingEvent.class, events.get(10));
-        assertIsInstanceOf(RouteStoppedEvent.class, events.get(11));
-        assertIsInstanceOf(RouteRemovedEvent.class, events.get(12));
-        assertIsInstanceOf(RouteStoppedEvent.class, events.get(13));
-        assertIsInstanceOf(RouteRemovedEvent.class, events.get(14));
-        assertIsInstanceOf(CamelContextStoppedEvent.class, events.get(15));
+        assertEquals(20, events.size());
+        assertIsInstanceOf(CamelContextStoppingEvent.class, events.get(12));
+        assertIsInstanceOf(CamelContextRoutesStoppingEvent.class, events.get(13));
+        assertIsInstanceOf(RouteStoppedEvent.class, events.get(14));
+        assertIsInstanceOf(RouteRemovedEvent.class, events.get(15));
+        assertIsInstanceOf(RouteStoppedEvent.class, events.get(16));
+        assertIsInstanceOf(RouteRemovedEvent.class, events.get(17));
+        assertIsInstanceOf(CamelContextRoutesStoppedEvent.class, events.get(18));
+        assertIsInstanceOf(CamelContextStoppedEvent.class, events.get(19));
 
         assertEquals(4, events2.size());
     }
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/RemoveEventNotifierTest.java b/core/camel-management/src/test/java/org/apache/camel/management/RemoveEventNotifierTest.java
index c1c916d..fe4c1e9 100644
--- a/core/camel-management/src/test/java/org/apache/camel/management/RemoveEventNotifierTest.java
+++ b/core/camel-management/src/test/java/org/apache/camel/management/RemoveEventNotifierTest.java
@@ -61,7 +61,7 @@ public class RemoveEventNotifierTest extends ContextTestSupport {
         template.sendBody("direct:start", "Hello World");
         assertMockEndpointsSatisfied();
 
-        assertEquals(12, events.size());
+        assertEquals(14, events.size());
 
         // remove and we should not get new events
         context.getManagementStrategy().removeEventNotifier(notifier);
@@ -71,7 +71,7 @@ public class RemoveEventNotifierTest extends ContextTestSupport {
         template.sendBody("direct:start", "Bye World");
         assertMockEndpointsSatisfied();
 
-        assertEquals(12, events.size());
+        assertEquals(14, events.size());
     }
 
     @Override
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 8b8719e..fb0b8f9 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
@@ -73,6 +73,30 @@ public final class EventHelper {
             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);
+    }
+
+    public static boolean notifyCamelContextRoutesStopping(CamelContext context) {
+        return doNotify(context,
+            factory -> factory.createCamelContextRoutesStoppingEvent(context),
+            EventNotifier::isIgnoreCamelContextEvents);
+    }
+
+    public static boolean notifyCamelContextRoutesStopped(CamelContext context) {
+        return doNotify(context,
+            factory -> factory.createCamelContextRoutesStoppedEvent(context),
+            EventNotifier::isIgnoreCamelContextEvents);
+    }
+
     public static boolean notifyCamelContextStopFailure(CamelContext context, Throwable cause) {
         return doNotify(context,
             factory -> factory.createCamelContextStopFailureEvent(context, cause),