You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by pp...@apache.org on 2022/01/12 16:38:04 UTC

[camel-quarkus] 09/10: Register CDI event bridges only when required

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

ppalaga pushed a commit to branch 2.2.x
in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git

commit 7ea0f3b4df993b26717352625e759168f6f11676
Author: James Netherton <ja...@gmail.com>
AuthorDate: Mon Oct 4 10:36:14 2021 +0100

    Register CDI event bridges only when required
    
    Fixes #3149
---
 .../ROOT/pages/reference/extensions/core.adoc      |   8 ++
 .../core/deployment/CamelContextProcessor.java     |  55 ++++++++++
 .../core/deployment/main/CamelMainProcessor.java   |  30 ++++++
 .../CamelMainEventBridgeDisabledConfigTest.java}   |  97 ++++++++---------
 .../main/CamelMainEventBridgeDisabledTest.java     |  59 +++++++++++
 .../CamelEventBridgeDisabledConfigTest.java        | 116 +++++++++++++++++++++
 .../core/runtime/CamelEventBridgeDisabledTest.java |  36 +++----
 ...bserversTest.java => CamelEventBridgeTest.java} |  24 +++--
 ...est.java => CamelLifecycleEventBridgeTest.java} |  22 ++--
 ...st.java => CamelManagementEventBridgeTest.java} |  66 +++++-------
 .../org/apache/camel/quarkus/core/CamelConfig.java |  23 ++++
 .../camel/quarkus/core/CamelContextRecorder.java   |  14 ++-
 .../quarkus/core/CamelLifecycleEventBridge.java    |  43 +++++---
 .../quarkus/core/CamelManagementEventBridge.java   |   9 +-
 .../camel/quarkus/main/CamelMainEventBridge.java   |  33 ++++--
 .../camel/quarkus/main/CamelMainRecorder.java      |   6 +-
 .../MicrometerMetricsConfigDefaultsTest.java       |   2 +-
 .../MicrometerMetricsConfigOverrideTest.java       |   9 --
 .../deployment/MicrometerMetricsDisabledTest.java  |   8 --
 .../MicroProfileMetricsConfigDefaultsTest.java     |   2 +-
 .../MicroProfileMetricsConfigOverrideTest.java     |   9 --
 21 files changed, 487 insertions(+), 184 deletions(-)

diff --git a/docs/modules/ROOT/pages/reference/extensions/core.adoc b/docs/modules/ROOT/pages/reference/extensions/core.adoc
index 5c575df..3a0c5aa 100644
--- a/docs/modules/ROOT/pages/reference/extensions/core.adoc
+++ b/docs/modules/ROOT/pages/reference/extensions/core.adoc
@@ -239,6 +239,14 @@ What to do if it is not possible to extract CSimple expressions from a route def
 | `org.apache.camel.quarkus.core.CamelConfig.FailureRemedy`
 | `warn`
 
+|icon:lock[title=Fixed at build time] [[quarkus.camel.event-bridge.enabled]]`link:#quarkus.camel.event-bridge.enabled[quarkus.camel.event-bridge.enabled]`
+
+Whether to enable the bridging of Camel events to CDI events. 
+ This allows CDI observers to be configured for Camel events. E.g. those belonging to the `org.apache.camel.quarkus.core.events`, `org.apache.camel.quarkus.main.events` & `org.apache.camel.impl.event` packages. 
+ Note that this configuration item only has any effect when observers configured for Camel events are present in the application.
+| `boolean`
+| `true`
+
 |icon:lock[title=Fixed at build time] [[quarkus.camel.main.enabled]]`link:#quarkus.camel.main.enabled[quarkus.camel.main.enabled]`
 
 If `true` all `camel-main` features are enabled; otherwise no `camel-main` features are enabled. See described the xref:user-guide/configuration.adoc[Configuration] section of Camel Quarkus documentation for more details.
diff --git a/extensions-core/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelContextProcessor.java b/extensions-core/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelContextProcessor.java
index e5b3add..73aa229 100644
--- a/extensions-core/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelContextProcessor.java
+++ b/extensions-core/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelContextProcessor.java
@@ -16,9 +16,14 @@
  */
 package org.apache.camel.quarkus.core.deployment;
 
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
+import java.util.function.BooleanSupplier;
+import java.util.stream.Collectors;
 
 import io.quarkus.arc.deployment.BeanContainerBuildItem;
+import io.quarkus.arc.deployment.BeanDiscoveryFinishedBuildItem;
 import io.quarkus.arc.deployment.SyntheticBeansRuntimeInitBuildItem;
 import io.quarkus.deployment.annotations.BuildStep;
 import io.quarkus.deployment.annotations.Consume;
@@ -163,4 +168,54 @@ public class CamelContextProcessor {
                 recorder.createRuntime(beanContainer.getValue(), context.getCamelContext()),
                 config.bootstrap.enabled);
     }
+
+    /**
+     * Registers Camel CDI event bridges if quarkus.camel.event-bridge.enabled=true and if
+     * the relevant events have CDI observers configured for them.
+     *
+     * @param beanDiscovery build item containing the results of bean discovery
+     * @param context       build item containing the CamelContext instance
+     * @param recorder      the CamelContext recorder instance
+     */
+    @Record(ExecutionTime.STATIC_INIT)
+    @BuildStep(onlyIf = EventBridgeEnabled.class)
+    public void registerCamelEventBridges(
+            BeanDiscoveryFinishedBuildItem beanDiscovery,
+            CamelContextBuildItem context,
+            CamelContextRecorder recorder) {
+
+        Set<String> observedLifecycleEvents = beanDiscovery.getObservers()
+                .stream()
+                .map(observerInfo -> observerInfo.getObservedType().name().toString())
+                .filter(observedType -> observedType.startsWith("org.apache.camel.quarkus.core.events"))
+                .collect(Collectors.collectingAndThen(Collectors.toUnmodifiableSet(), HashSet::new));
+
+        // For management events the event class simple name is collected as users can
+        // observe events on either the Camel event interface or the concrete event class, and
+        // these are located in different packages
+        Set<String> observedManagementEvents = beanDiscovery.getObservers()
+                .stream()
+                .map(observerInfo -> observerInfo.getObservedType().name().toString())
+                .filter(className -> className.matches("org.apache.camel(?!.quarkus).*Event$"))
+                .map(className -> CamelSupport.loadClass(className, Thread.currentThread().getContextClassLoader()))
+                .map(observedEventClass -> observedEventClass.getSimpleName())
+                .collect(Collectors.collectingAndThen(Collectors.toUnmodifiableSet(), HashSet::new));
+
+        if (!observedLifecycleEvents.isEmpty()) {
+            recorder.registerLifecycleEventBridge(context.getCamelContext(), observedLifecycleEvents);
+        }
+
+        if (!observedManagementEvents.isEmpty()) {
+            recorder.registerManagementEventBridge(context.getCamelContext(), observedManagementEvents);
+        }
+    }
+
+    public static final class EventBridgeEnabled implements BooleanSupplier {
+        CamelConfig config;
+
+        @Override
+        public boolean getAsBoolean() {
+            return config.eventBridge.enabled;
+        }
+    }
 }
diff --git a/extensions-core/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/main/CamelMainProcessor.java b/extensions-core/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/main/CamelMainProcessor.java
index 5acba9e..07dae03 100644
--- a/extensions-core/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/main/CamelMainProcessor.java
+++ b/extensions-core/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/main/CamelMainProcessor.java
@@ -16,11 +16,14 @@
  */
 package org.apache.camel.quarkus.core.deployment.main;
 
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 import java.util.stream.Collectors;
 
 import io.quarkus.arc.deployment.AdditionalBeanBuildItem;
 import io.quarkus.arc.deployment.BeanContainerBuildItem;
+import io.quarkus.arc.deployment.BeanDiscoveryFinishedBuildItem;
 import io.quarkus.arc.deployment.SyntheticBeansRuntimeInitBuildItem;
 import io.quarkus.deployment.annotations.BuildProducer;
 import io.quarkus.deployment.annotations.BuildStep;
@@ -36,6 +39,7 @@ import org.apache.camel.CamelContext;
 import org.apache.camel.quarkus.core.CamelConfig;
 import org.apache.camel.quarkus.core.CamelRecorder;
 import org.apache.camel.quarkus.core.CamelRuntime;
+import org.apache.camel.quarkus.core.deployment.CamelContextProcessor.EventBridgeEnabled;
 import org.apache.camel.quarkus.core.deployment.main.spi.CamelMainBuildItem;
 import org.apache.camel.quarkus.core.deployment.main.spi.CamelMainEnabled;
 import org.apache.camel.quarkus.core.deployment.main.spi.CamelMainListenerBuildItem;
@@ -191,6 +195,32 @@ public class CamelMainProcessor {
                 index.getIndex().getAnnotations(DotName.createSimple(QuarkusMain.class.getName())).isEmpty());
     }
 
+    /**
+     * Registers Camel Main CDI event bridges if quarkus.camel.event-bridge.enabled=true and if
+     * the relevant events have CDI observers configured for them.
+     *
+     * @param beanDiscovery build item containing the results of bean discovery
+     * @param main          build item containing the CamelMain instance
+     * @param recorder      the CamelContext recorder instance
+     */
+    @Record(ExecutionTime.STATIC_INIT)
+    @BuildStep(onlyIf = { CamelMainEnabled.class, EventBridgeEnabled.class })
+    public void registerCamelMainEventBridge(
+            BeanDiscoveryFinishedBuildItem beanDiscovery,
+            CamelMainBuildItem main,
+            CamelMainRecorder recorder) {
+
+        Set<String> observedMainEvents = beanDiscovery.getObservers()
+                .stream()
+                .map(observerInfo -> observerInfo.getObservedType().name().toString())
+                .filter(observedType -> observedType.startsWith("org.apache.camel.quarkus.main.events"))
+                .collect(Collectors.collectingAndThen(Collectors.toUnmodifiableSet(), HashSet::new));
+
+        if (!observedMainEvents.isEmpty()) {
+            recorder.registerCamelMainEventBridge(main.getInstance(), observedMainEvents);
+        }
+    }
+
     @BuildStep(onlyIf = CamelMainEnabled.class)
     AdditionalIndexedClassesBuildItem indexCamelMainApplication() {
         // Required for launching CamelMain based applications from the IDE
diff --git a/extensions-core/core/deployment/src/test/java/org/apache/camel/quarkus/core/runtime/CamelObserversTest.java b/extensions-core/core/deployment/src/test/java/org/apache/camel/quarkus/core/deployment/main/CamelMainEventBridgeDisabledConfigTest.java
similarity index 50%
copy from extensions-core/core/deployment/src/test/java/org/apache/camel/quarkus/core/runtime/CamelObserversTest.java
copy to extensions-core/core/deployment/src/test/java/org/apache/camel/quarkus/core/deployment/main/CamelMainEventBridgeDisabledConfigTest.java
index 12a301a..032396e 100644
--- a/extensions-core/core/deployment/src/test/java/org/apache/camel/quarkus/core/runtime/CamelObserversTest.java
+++ b/extensions-core/core/deployment/src/test/java/org/apache/camel/quarkus/core/deployment/main/CamelMainEventBridgeDisabledConfigTest.java
@@ -14,11 +14,14 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.quarkus.core.runtime;
+package org.apache.camel.quarkus.core.deployment.main;
 
+import java.io.IOException;
+import java.io.StringWriter;
+import java.io.Writer;
+import java.util.Properties;
 import java.util.Set;
 import java.util.concurrent.CopyOnWriteArraySet;
-import java.util.concurrent.TimeUnit;
 
 import javax.enterprise.context.ApplicationScoped;
 import javax.enterprise.event.Observes;
@@ -26,82 +29,82 @@ import javax.inject.Inject;
 
 import io.quarkus.test.QuarkusUnitTest;
 import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.component.direct.DirectComponent;
-import org.apache.camel.impl.event.RouteStartedEvent;
-import org.apache.camel.quarkus.core.events.ComponentAddEvent;
-import org.apache.camel.quarkus.core.events.EndpointAddEvent;
-import org.apache.camel.quarkus.core.events.ServiceAddEvent;
+import org.apache.camel.model.ModelCamelContext;
+import org.apache.camel.quarkus.main.CamelMain;
+import org.apache.camel.quarkus.main.CamelMainEventBridge;
+import org.apache.camel.quarkus.main.events.AfterConfigure;
+import org.apache.camel.quarkus.main.events.AfterStart;
 import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.asset.Asset;
+import org.jboss.shrinkwrap.api.asset.StringAsset;
 import org.jboss.shrinkwrap.api.spec.JavaArchive;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.awaitility.Awaitility.await;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
-public class CamelObserversTest {
+public class CamelMainEventBridgeDisabledConfigTest {
     @RegisterExtension
     static final QuarkusUnitTest CONFIG = new QuarkusUnitTest()
-            .setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class));
+            .setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class)
+                    .addAsResource(applicationProperties(), "application.properties"));
+
+    @Inject
+    CamelMain main;
 
     @Inject
     EventHandler handler;
 
     @Test
     public void testObservers() {
-        await().atMost(10, TimeUnit.SECONDS).untilAsserted(() -> {
-            assertThat(handler.routes())
-                    .contains(MyRoutes.ROUTE_ID);
-            assertThat(handler.components())
-                    .contains(DirectComponent.class.getName());
-            assertThat(handler.endpoints())
-                    .contains(MyRoutes.FROM_ENDPOINT);
-            assertThat(handler.service())
-                    .isNotEmpty();
-        });
+        assertFalse(main.getMainListeners().stream().anyMatch(mainListener -> mainListener
+                .getClass()
+                .equals(CamelMainEventBridge.class)));
+        assertTrue(handler.builders().isEmpty());
+        assertTrue(handler.routes().isEmpty());
     }
 
-    @ApplicationScoped
-    public static class EventHandler {
-        private final Set<String> routes = new CopyOnWriteArraySet<>();
-        private final Set<String> endpoints = new CopyOnWriteArraySet<>();
-        private final Set<String> components = new CopyOnWriteArraySet<>();
-        private final Set<String> service = new CopyOnWriteArraySet<>();
+    public static Asset applicationProperties() {
+        Writer writer = new StringWriter();
 
-        public void onRouteStarted(@Observes RouteStartedEvent event) {
-            routes.add(event.getRoute().getRouteId());
-        }
+        Properties props = new Properties();
+        props.setProperty("quarkus.banner.enabled", "false");
+        props.setProperty("quarkus.camel.event-bridge.enabled", "false");
 
-        public void onComponentAdd(@Observes ComponentAddEvent event) {
-            components.add(event.getComponent().getClass().getName());
+        try {
+            props.store(writer, "");
+        } catch (IOException e) {
+            throw new RuntimeException(e);
         }
 
-        public void onEndpointAdd(@Observes EndpointAddEvent event) {
-            endpoints.add(event.getEndpoint().getEndpointUri());
-        }
+        return new StringAsset(writer.toString());
+    }
 
-        public void onServiceAdd(@Observes ServiceAddEvent event) {
-            service.add(event.getService().getClass().getName());
-        }
+    @ApplicationScoped
+    public static class EventHandler {
+        private final Set<String> builders = new CopyOnWriteArraySet<>();
+        private final Set<String> routes = new CopyOnWriteArraySet<>();
 
-        public Set<String> routes() {
-            return routes;
+        public void afterConfigure(@Observes AfterConfigure event) {
+            event.getMain().configure().getRoutesBuilders().forEach(
+                    builder -> builders.add(builder.getClass().getName()));
         }
 
-        public Set<String> components() {
-            return components;
+        public void afterStart(@Observes AfterStart event) {
+            event.getCamelContext(ModelCamelContext.class).getRoutes().forEach(
+                    route -> routes.add(route.getRouteId()));
         }
 
-        public Set<String> endpoints() {
-            return endpoints;
+        public Set<String> builders() {
+            return builders;
         }
 
-        public Set<String> service() {
-            return service;
+        public Set<String> routes() {
+            return routes;
         }
     }
 
-    @ApplicationScoped
     public static class MyRoutes extends RouteBuilder {
         public static String ROUTE_ID = "myRoute";
         public static String FROM_ENDPOINT = "direct://start";
diff --git a/extensions-core/core/deployment/src/test/java/org/apache/camel/quarkus/core/deployment/main/CamelMainEventBridgeDisabledTest.java b/extensions-core/core/deployment/src/test/java/org/apache/camel/quarkus/core/deployment/main/CamelMainEventBridgeDisabledTest.java
new file mode 100644
index 0000000..2d63674
--- /dev/null
+++ b/extensions-core/core/deployment/src/test/java/org/apache/camel/quarkus/core/deployment/main/CamelMainEventBridgeDisabledTest.java
@@ -0,0 +1,59 @@
+/*
+ * 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.quarkus.core.deployment.main;
+
+import javax.inject.Inject;
+
+import io.quarkus.test.QuarkusUnitTest;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.quarkus.main.CamelMain;
+import org.apache.camel.quarkus.main.CamelMainEventBridge;
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.spec.JavaArchive;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
+
+import static org.junit.jupiter.api.Assertions.assertFalse;
+
+public class CamelMainEventBridgeDisabledTest {
+    @RegisterExtension
+    static final QuarkusUnitTest CONFIG = new QuarkusUnitTest()
+            .setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class));
+
+    @Inject
+    CamelMain main;
+
+    @Test
+    public void camelMainEventBridgeNotConfigured() {
+        // Since no CDI observers for main events are configured the event bridge should not be present
+        assertFalse(main.getMainListeners().stream().anyMatch(mainListener -> mainListener
+                .getClass()
+                .equals(CamelMainEventBridge.class)));
+    }
+
+    public static class MyRoutes extends RouteBuilder {
+        public static String ROUTE_ID = "myRoute";
+        public static String FROM_ENDPOINT = "direct://start";
+
+        @Override
+        public void configure() throws Exception {
+            from(FROM_ENDPOINT)
+                    .routeId(ROUTE_ID)
+                    .log("${body}");
+        }
+    }
+}
diff --git a/extensions-core/core/deployment/src/test/java/org/apache/camel/quarkus/core/runtime/CamelEventBridgeDisabledConfigTest.java b/extensions-core/core/deployment/src/test/java/org/apache/camel/quarkus/core/runtime/CamelEventBridgeDisabledConfigTest.java
new file mode 100644
index 0000000..2ca706b
--- /dev/null
+++ b/extensions-core/core/deployment/src/test/java/org/apache/camel/quarkus/core/runtime/CamelEventBridgeDisabledConfigTest.java
@@ -0,0 +1,116 @@
+/*
+ * 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.quarkus.core.runtime;
+
+import java.io.IOException;
+import java.io.StringWriter;
+import java.io.Writer;
+import java.util.Properties;
+import java.util.Set;
+import java.util.concurrent.CopyOnWriteArraySet;
+
+import javax.enterprise.context.ApplicationScoped;
+import javax.enterprise.event.Observes;
+import javax.inject.Inject;
+
+import io.quarkus.test.QuarkusUnitTest;
+import org.apache.camel.CamelContext;
+import org.apache.camel.impl.event.RouteAddedEvent;
+import org.apache.camel.quarkus.core.CamelLifecycleEventBridge;
+import org.apache.camel.quarkus.core.events.ServiceAddEvent;
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.asset.Asset;
+import org.jboss.shrinkwrap.api.asset.StringAsset;
+import org.jboss.shrinkwrap.api.spec.JavaArchive;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
+
+import static org.apache.camel.spi.CamelEvent.*;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+public class CamelEventBridgeDisabledConfigTest {
+
+    @RegisterExtension
+    static final QuarkusUnitTest CONFIG = new QuarkusUnitTest()
+            .setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class)
+                    .addAsResource(applicationProperties(), "application.properties"));
+
+    @Inject
+    CamelContext context;
+
+    @Inject
+    EventHandler handler;
+
+    @Test
+    public void camelManagementEventBridgeNotConfigured() {
+        assertFalse(context.getLifecycleStrategies()
+                .stream()
+                .anyMatch(lifecycleStrategy -> lifecycleStrategy.getClass().equals(CamelLifecycleEventBridge.class)));
+        assertTrue(context.getManagementStrategy().getEventNotifiers().isEmpty());
+        assertTrue(handler.getServices().isEmpty());
+        assertTrue(handler.getRoutesAdded().isEmpty());
+        assertTrue(handler.getRoutesRemoved().isEmpty());
+    }
+
+    public static Asset applicationProperties() {
+        Writer writer = new StringWriter();
+
+        Properties props = new Properties();
+        props.setProperty("quarkus.banner.enabled", "false");
+        props.setProperty("quarkus.camel.event-bridge.enabled", "false");
+
+        try {
+            props.store(writer, "");
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+
+        return new StringAsset(writer.toString());
+    }
+
+    @ApplicationScoped
+    static final class EventHandler {
+        private final Set<ServiceAddEvent> services = new CopyOnWriteArraySet<>();
+        private final Set<RouteAddedEvent> routesAdded = new CopyOnWriteArraySet<>();
+        private final Set<RouteRemovedEvent> routesRemoved = new CopyOnWriteArraySet<>();
+
+        public void onServiceAdd(@Observes ServiceAddEvent event) {
+            services.add(event);
+        }
+
+        public void onRouteAdd(@Observes RouteAddedEvent event) {
+            routesAdded.add(event);
+        }
+
+        public void onRouteRemoved(@Observes RouteRemovedEvent event) {
+            routesRemoved.add(event);
+        }
+
+        public Set<ServiceAddEvent> getServices() {
+            return services;
+        }
+
+        public Set<RouteAddedEvent> getRoutesAdded() {
+            return routesAdded;
+        }
+
+        public Set<RouteRemovedEvent> getRoutesRemoved() {
+            return routesRemoved;
+        }
+    }
+}
diff --git a/extensions/micrometer/deployment/src/test/java/org/apache/camel/quarkus/component/micrometer/deployment/MicrometerMetricsDisabledTest.java b/extensions-core/core/deployment/src/test/java/org/apache/camel/quarkus/core/runtime/CamelEventBridgeDisabledTest.java
similarity index 58%
copy from extensions/micrometer/deployment/src/test/java/org/apache/camel/quarkus/component/micrometer/deployment/MicrometerMetricsDisabledTest.java
copy to extensions-core/core/deployment/src/test/java/org/apache/camel/quarkus/core/runtime/CamelEventBridgeDisabledTest.java
index 9583704..86b8138 100644
--- a/extensions/micrometer/deployment/src/test/java/org/apache/camel/quarkus/component/micrometer/deployment/MicrometerMetricsDisabledTest.java
+++ b/extensions-core/core/deployment/src/test/java/org/apache/camel/quarkus/core/runtime/CamelEventBridgeDisabledTest.java
@@ -14,23 +14,18 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.quarkus.component.micrometer.deployment;
+package org.apache.camel.quarkus.core.runtime;
 
 import java.io.IOException;
 import java.io.StringWriter;
 import java.io.Writer;
-import java.util.List;
 import java.util.Properties;
 
 import javax.inject.Inject;
 
 import io.quarkus.test.QuarkusUnitTest;
 import org.apache.camel.CamelContext;
-import org.apache.camel.impl.engine.DefaultMessageHistoryFactory;
-import org.apache.camel.quarkus.core.CamelManagementEventBridge;
-import org.apache.camel.spi.EventNotifier;
-import org.apache.camel.spi.MessageHistoryFactory;
-import org.apache.camel.spi.RoutePolicyFactory;
+import org.apache.camel.quarkus.core.CamelLifecycleEventBridge;
 import org.jboss.shrinkwrap.api.ShrinkWrap;
 import org.jboss.shrinkwrap.api.asset.Asset;
 import org.jboss.shrinkwrap.api.asset.StringAsset;
@@ -38,11 +33,10 @@ import org.jboss.shrinkwrap.api.spec.JavaArchive;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
-public class MicrometerMetricsDisabledTest {
+public class CamelEventBridgeDisabledTest {
 
     @RegisterExtension
     static final QuarkusUnitTest CONFIG = new QuarkusUnitTest()
@@ -53,25 +47,19 @@ public class MicrometerMetricsDisabledTest {
     CamelContext context;
 
     @Test
-    public void testMicrometerMetricsDisabled() {
-        List<RoutePolicyFactory> routePolicyFactories = context.getRoutePolicyFactories();
-        assertTrue(routePolicyFactories.isEmpty());
-
-        MessageHistoryFactory messageHistoryFactory = context.getMessageHistoryFactory();
-        assertNotNull(messageHistoryFactory);
-        assertTrue(messageHistoryFactory instanceof DefaultMessageHistoryFactory);
-
-        // There should always be one event notifier added by core for CamelManagementEventBridge
-        List<EventNotifier> eventNotifiers = context.getManagementStrategy().getEventNotifiers();
-        assertEquals(1, eventNotifiers.size());
-        assertTrue(eventNotifiers.get(0) instanceof CamelManagementEventBridge);
+    public void camelEventBridgeNotConfigured() {
+        // No CDI observers for camel events are configured so event bridging support should not be present
+        assertFalse(context.getLifecycleStrategies()
+                .stream()
+                .anyMatch(lifecycleStrategy -> lifecycleStrategy.getClass().equals(CamelLifecycleEventBridge.class)));
+        assertTrue(context.getManagementStrategy().getEventNotifiers().isEmpty());
     }
 
-    public static final Asset applicationProperties() {
+    public static Asset applicationProperties() {
         Writer writer = new StringWriter();
 
         Properties props = new Properties();
-        props.setProperty("quarkus.micrometer.enabled", "false");
+        props.setProperty("quarkus.banner.enabled", "false");
 
         try {
             props.store(writer, "");
diff --git a/extensions-core/core/deployment/src/test/java/org/apache/camel/quarkus/core/runtime/CamelObserversTest.java b/extensions-core/core/deployment/src/test/java/org/apache/camel/quarkus/core/runtime/CamelEventBridgeTest.java
similarity index 83%
copy from extensions-core/core/deployment/src/test/java/org/apache/camel/quarkus/core/runtime/CamelObserversTest.java
copy to extensions-core/core/deployment/src/test/java/org/apache/camel/quarkus/core/runtime/CamelEventBridgeTest.java
index 12a301a..138f631 100644
--- a/extensions-core/core/deployment/src/test/java/org/apache/camel/quarkus/core/runtime/CamelObserversTest.java
+++ b/extensions-core/core/deployment/src/test/java/org/apache/camel/quarkus/core/runtime/CamelEventBridgeTest.java
@@ -31,6 +31,7 @@ import org.apache.camel.impl.event.RouteStartedEvent;
 import org.apache.camel.quarkus.core.events.ComponentAddEvent;
 import org.apache.camel.quarkus.core.events.EndpointAddEvent;
 import org.apache.camel.quarkus.core.events.ServiceAddEvent;
+import org.apache.camel.spi.CamelEvent;
 import org.jboss.shrinkwrap.api.ShrinkWrap;
 import org.jboss.shrinkwrap.api.spec.JavaArchive;
 import org.junit.jupiter.api.Test;
@@ -39,7 +40,7 @@ import org.junit.jupiter.api.extension.RegisterExtension;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.awaitility.Awaitility.await;
 
-public class CamelObserversTest {
+public class CamelEventBridgeTest {
     @RegisterExtension
     static final QuarkusUnitTest CONFIG = new QuarkusUnitTest()
             .setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class));
@@ -50,7 +51,9 @@ public class CamelObserversTest {
     @Test
     public void testObservers() {
         await().atMost(10, TimeUnit.SECONDS).untilAsserted(() -> {
-            assertThat(handler.routes())
+            assertThat(handler.routesAdded())
+                    .contains(MyRoutes.ROUTE_ID);
+            assertThat(handler.routesStarted())
                     .contains(MyRoutes.ROUTE_ID);
             assertThat(handler.components())
                     .contains(DirectComponent.class.getName());
@@ -63,13 +66,18 @@ public class CamelObserversTest {
 
     @ApplicationScoped
     public static class EventHandler {
-        private final Set<String> routes = new CopyOnWriteArraySet<>();
+        private final Set<String> routesAdded = new CopyOnWriteArraySet<>();
+        private final Set<String> routesStarted = new CopyOnWriteArraySet<>();
         private final Set<String> endpoints = new CopyOnWriteArraySet<>();
         private final Set<String> components = new CopyOnWriteArraySet<>();
         private final Set<String> service = new CopyOnWriteArraySet<>();
 
+        public void onRouteAdded(@Observes CamelEvent.RouteAddedEvent event) {
+            routesAdded.add(event.getRoute().getRouteId());
+        }
+
         public void onRouteStarted(@Observes RouteStartedEvent event) {
-            routes.add(event.getRoute().getRouteId());
+            routesStarted.add(event.getRoute().getRouteId());
         }
 
         public void onComponentAdd(@Observes ComponentAddEvent event) {
@@ -84,8 +92,12 @@ public class CamelObserversTest {
             service.add(event.getService().getClass().getName());
         }
 
-        public Set<String> routes() {
-            return routes;
+        public Set<String> routesAdded() {
+            return routesAdded;
+        }
+
+        public Set<String> routesStarted() {
+            return routesStarted;
         }
 
         public Set<String> components() {
diff --git a/extensions-core/core/deployment/src/test/java/org/apache/camel/quarkus/core/runtime/CamelObserversTest.java b/extensions-core/core/deployment/src/test/java/org/apache/camel/quarkus/core/runtime/CamelLifecycleEventBridgeTest.java
similarity index 88%
copy from extensions-core/core/deployment/src/test/java/org/apache/camel/quarkus/core/runtime/CamelObserversTest.java
copy to extensions-core/core/deployment/src/test/java/org/apache/camel/quarkus/core/runtime/CamelLifecycleEventBridgeTest.java
index 12a301a..8479439 100644
--- a/extensions-core/core/deployment/src/test/java/org/apache/camel/quarkus/core/runtime/CamelObserversTest.java
+++ b/extensions-core/core/deployment/src/test/java/org/apache/camel/quarkus/core/runtime/CamelLifecycleEventBridgeTest.java
@@ -25,9 +25,9 @@ import javax.enterprise.event.Observes;
 import javax.inject.Inject;
 
 import io.quarkus.test.QuarkusUnitTest;
+import org.apache.camel.CamelContext;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.direct.DirectComponent;
-import org.apache.camel.impl.event.RouteStartedEvent;
 import org.apache.camel.quarkus.core.events.ComponentAddEvent;
 import org.apache.camel.quarkus.core.events.EndpointAddEvent;
 import org.apache.camel.quarkus.core.events.ServiceAddEvent;
@@ -38,8 +38,9 @@ import org.junit.jupiter.api.extension.RegisterExtension;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.awaitility.Awaitility.await;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
-public class CamelObserversTest {
+public class CamelLifecycleEventBridgeTest {
     @RegisterExtension
     static final QuarkusUnitTest CONFIG = new QuarkusUnitTest()
             .setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class));
@@ -47,11 +48,15 @@ public class CamelObserversTest {
     @Inject
     EventHandler handler;
 
+    @Inject
+    CamelContext context;
+
     @Test
     public void testObservers() {
+        // We're only observing lifecycle events so the management strategy should not be configured
+        assertTrue(context.getManagementStrategy().getEventNotifiers().isEmpty());
+
         await().atMost(10, TimeUnit.SECONDS).untilAsserted(() -> {
-            assertThat(handler.routes())
-                    .contains(MyRoutes.ROUTE_ID);
             assertThat(handler.components())
                     .contains(DirectComponent.class.getName());
             assertThat(handler.endpoints())
@@ -63,15 +68,10 @@ public class CamelObserversTest {
 
     @ApplicationScoped
     public static class EventHandler {
-        private final Set<String> routes = new CopyOnWriteArraySet<>();
         private final Set<String> endpoints = new CopyOnWriteArraySet<>();
         private final Set<String> components = new CopyOnWriteArraySet<>();
         private final Set<String> service = new CopyOnWriteArraySet<>();
 
-        public void onRouteStarted(@Observes RouteStartedEvent event) {
-            routes.add(event.getRoute().getRouteId());
-        }
-
         public void onComponentAdd(@Observes ComponentAddEvent event) {
             components.add(event.getComponent().getClass().getName());
         }
@@ -84,10 +84,6 @@ public class CamelObserversTest {
             service.add(event.getService().getClass().getName());
         }
 
-        public Set<String> routes() {
-            return routes;
-        }
-
         public Set<String> components() {
             return components;
         }
diff --git a/extensions-core/core/deployment/src/test/java/org/apache/camel/quarkus/core/runtime/CamelObserversTest.java b/extensions-core/core/deployment/src/test/java/org/apache/camel/quarkus/core/runtime/CamelManagementEventBridgeTest.java
similarity index 59%
rename from extensions-core/core/deployment/src/test/java/org/apache/camel/quarkus/core/runtime/CamelObserversTest.java
rename to extensions-core/core/deployment/src/test/java/org/apache/camel/quarkus/core/runtime/CamelManagementEventBridgeTest.java
index 12a301a..50b0530 100644
--- a/extensions-core/core/deployment/src/test/java/org/apache/camel/quarkus/core/runtime/CamelObserversTest.java
+++ b/extensions-core/core/deployment/src/test/java/org/apache/camel/quarkus/core/runtime/CamelManagementEventBridgeTest.java
@@ -25,12 +25,11 @@ import javax.enterprise.event.Observes;
 import javax.inject.Inject;
 
 import io.quarkus.test.QuarkusUnitTest;
+import org.apache.camel.CamelContext;
 import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.component.direct.DirectComponent;
 import org.apache.camel.impl.event.RouteStartedEvent;
-import org.apache.camel.quarkus.core.events.ComponentAddEvent;
-import org.apache.camel.quarkus.core.events.EndpointAddEvent;
-import org.apache.camel.quarkus.core.events.ServiceAddEvent;
+import org.apache.camel.quarkus.core.CamelLifecycleEventBridge;
+import org.apache.camel.spi.CamelEvent.RouteAddedEvent;
 import org.jboss.shrinkwrap.api.ShrinkWrap;
 import org.jboss.shrinkwrap.api.spec.JavaArchive;
 import org.junit.jupiter.api.Test;
@@ -38,8 +37,9 @@ import org.junit.jupiter.api.extension.RegisterExtension;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.awaitility.Awaitility.await;
+import static org.junit.jupiter.api.Assertions.assertFalse;
 
-public class CamelObserversTest {
+public class CamelManagementEventBridgeTest {
     @RegisterExtension
     static final QuarkusUnitTest CONFIG = new QuarkusUnitTest()
             .setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class));
@@ -47,57 +47,43 @@ public class CamelObserversTest {
     @Inject
     EventHandler handler;
 
+    @Inject
+    CamelContext context;
+
     @Test
     public void testObservers() {
+        // We're only observing management events so the lifecycle strategy should not be configured
+        assertFalse(context.getLifecycleStrategies()
+                .stream()
+                .anyMatch(lifecycleStrategy -> lifecycleStrategy.getClass().equals(CamelLifecycleEventBridge.class)));
+
         await().atMost(10, TimeUnit.SECONDS).untilAsserted(() -> {
-            assertThat(handler.routes())
+            assertThat(handler.routesAdded())
+                    .contains(MyRoutes.ROUTE_ID);
+            assertThat(handler.routesStarted())
                     .contains(MyRoutes.ROUTE_ID);
-            assertThat(handler.components())
-                    .contains(DirectComponent.class.getName());
-            assertThat(handler.endpoints())
-                    .contains(MyRoutes.FROM_ENDPOINT);
-            assertThat(handler.service())
-                    .isNotEmpty();
         });
     }
 
     @ApplicationScoped
     public static class EventHandler {
-        private final Set<String> routes = new CopyOnWriteArraySet<>();
-        private final Set<String> endpoints = new CopyOnWriteArraySet<>();
-        private final Set<String> components = new CopyOnWriteArraySet<>();
-        private final Set<String> service = new CopyOnWriteArraySet<>();
-
-        public void onRouteStarted(@Observes RouteStartedEvent event) {
-            routes.add(event.getRoute().getRouteId());
-        }
+        private final Set<String> routesAdded = new CopyOnWriteArraySet<>();
+        private final Set<String> routesStarted = new CopyOnWriteArraySet<>();
 
-        public void onComponentAdd(@Observes ComponentAddEvent event) {
-            components.add(event.getComponent().getClass().getName());
+        public void onRouteAdded(@Observes RouteAddedEvent event) {
+            routesAdded.add(event.getRoute().getRouteId());
         }
 
-        public void onEndpointAdd(@Observes EndpointAddEvent event) {
-            endpoints.add(event.getEndpoint().getEndpointUri());
-        }
-
-        public void onServiceAdd(@Observes ServiceAddEvent event) {
-            service.add(event.getService().getClass().getName());
-        }
-
-        public Set<String> routes() {
-            return routes;
-        }
-
-        public Set<String> components() {
-            return components;
+        public void onRouteStarted(@Observes RouteStartedEvent event) {
+            routesStarted.add(event.getRoute().getRouteId());
         }
 
-        public Set<String> endpoints() {
-            return endpoints;
+        public Set<String> routesAdded() {
+            return routesAdded;
         }
 
-        public Set<String> service() {
-            return service;
+        public Set<String> routesStarted() {
+            return routesStarted;
         }
     }
 
diff --git a/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelConfig.java b/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelConfig.java
index 4288399..0249167 100644
--- a/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelConfig.java
+++ b/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelConfig.java
@@ -66,6 +66,12 @@ public class CamelConfig {
     @ConfigItem
     public CSimpleConfig csimple;
 
+    /**
+     * Build time configuration options for the Camel CDI event bridge.
+     */
+    @ConfigItem
+    public EventBridgeConfig eventBridge;
+
     @ConfigGroup
     public static class BootstrapConfig {
         /**
@@ -353,4 +359,21 @@ public class CamelConfig {
         @ConfigItem(defaultValue = "warn")
         public FailureRemedy onBuildTimeAnalysisFailure;
     }
+
+    @ConfigGroup
+    public static class EventBridgeConfig {
+
+        /**
+         * Whether to enable the bridging of Camel events to CDI events.
+         * <p>
+         * This allows CDI observers to be configured for Camel events. E.g. those belonging to the
+         * {@code org.apache.camel.quarkus.core.events}, {@code org.apache.camel.quarkus.main.events} &
+         * {@code org.apache.camel.impl.event} packages.
+         * <p>
+         * Note that this configuration item only has any effect when observers configured for Camel events
+         * are present in the application.
+         */
+        @ConfigItem(defaultValue = "true")
+        public boolean enabled;
+    }
 }
diff --git a/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelContextRecorder.java b/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelContextRecorder.java
index 25deef0..7c2df25 100644
--- a/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelContextRecorder.java
+++ b/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelContextRecorder.java
@@ -16,6 +16,8 @@
  */
 package org.apache.camel.quarkus.core;
 
+import java.util.Set;
+
 import io.quarkus.arc.runtime.BeanContainer;
 import io.quarkus.runtime.RuntimeValue;
 import io.quarkus.runtime.annotations.Recorder;
@@ -63,8 +65,6 @@ public class CamelContextRecorder {
         context.setModelJAXBContextFactory(contextFactory.getValue());
         context.adapt(ExtendedCamelContext.class).setStartupStepRecorder(startupStepRecorder.getValue());
         context.build();
-        context.addLifecycleStrategy(new CamelLifecycleEventBridge());
-        context.getManagementStrategy().addEventNotifier(new CamelManagementEventBridge());
         context.setComponentNameResolver(componentNameResolver.getValue());
 
         // register to the container
@@ -122,4 +122,14 @@ public class CamelContextRecorder {
             throw new RuntimeException(e);
         }
     }
+
+    public void registerLifecycleEventBridge(RuntimeValue<CamelContext> context, Set<String> observedLifecycleEvents) {
+        context.getValue().addLifecycleStrategy(new CamelLifecycleEventBridge(observedLifecycleEvents));
+    }
+
+    public void registerManagementEventBridge(RuntimeValue<CamelContext> camelContext, Set<String> observedManagementEvents) {
+        camelContext.getValue()
+                .getManagementStrategy()
+                .addEventNotifier(new CamelManagementEventBridge(observedManagementEvents));
+    }
 }
diff --git a/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelLifecycleEventBridge.java b/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelLifecycleEventBridge.java
index a675ed9..0f9fcc9 100644
--- a/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelLifecycleEventBridge.java
+++ b/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelLifecycleEventBridge.java
@@ -17,6 +17,7 @@
 package org.apache.camel.quarkus.core;
 
 import java.util.Collection;
+import java.util.Set;
 import java.util.concurrent.ThreadPoolExecutor;
 import java.util.function.Supplier;
 
@@ -45,7 +46,7 @@ import org.apache.camel.util.function.Suppliers;
 
 /**
  * Bridges {@link org.apache.camel.spi.LifecycleStrategy} callbacks and CDI by producing the correspondent
- * events.
+ * events. Events are only fired if a corresponding CDI observer is configured for them.
  * <p>
  * Note that this class does not implement all the callback as some notifications them are already covered
  * by management events {@link CamelManagementEventBridge}
@@ -64,9 +65,11 @@ import org.apache.camel.util.function.Suppliers;
  */
 public class CamelLifecycleEventBridge implements LifecycleStrategy {
     private final Supplier<BeanManager> beanManager;
+    private final Set<String> observedLifecycleEvents;
 
-    public CamelLifecycleEventBridge() {
+    public CamelLifecycleEventBridge(Set<String> observedLifecycleEvents) {
         this.beanManager = Suppliers.memorize(Arc.container()::beanManager);
+        this.observedLifecycleEvents = observedLifecycleEvents;
     }
 
     private <T extends CamelEvent> void fireEvent(T event) {
@@ -75,43 +78,59 @@ public class CamelLifecycleEventBridge implements LifecycleStrategy {
 
     @Override
     public void onComponentAdd(String name, Component component) {
-        fireEvent(new ComponentAddEvent(component));
+        if (observedLifecycleEvents.contains(ComponentAddEvent.class.getName())) {
+            fireEvent(new ComponentAddEvent(component));
+        }
     }
 
     @Override
     public void onComponentRemove(String name, Component component) {
-        fireEvent(new ComponentRemoveEvent(component));
+        if (observedLifecycleEvents.contains(ComponentRemoveEvent.class.getName())) {
+            fireEvent(new ComponentRemoveEvent(component));
+        }
     }
 
     @Override
     public void onEndpointAdd(Endpoint endpoint) {
-        fireEvent(new EndpointAddEvent(endpoint));
+        if (observedLifecycleEvents.contains(EndpointAddEvent.class.getName())) {
+            fireEvent(new EndpointAddEvent(endpoint));
+        }
     }
 
     @Override
     public void onEndpointRemove(Endpoint endpoint) {
-        fireEvent(new EndpointRemoveEvent(endpoint));
+        if (observedLifecycleEvents.contains(EndpointRemoveEvent.class.getName())) {
+            fireEvent(new EndpointRemoveEvent(endpoint));
+        }
     }
 
     @Override
     public void onThreadPoolAdd(CamelContext camelContext, ThreadPoolExecutor threadPool, String id,
             String sourceId, String routeId, String threadPoolProfileId) {
-        fireEvent(new ThreadPoolAddEvent(camelContext, threadPool, id, sourceId, routeId, threadPoolProfileId));
+        if (observedLifecycleEvents.contains(ThreadPoolAddEvent.class.getName())) {
+            fireEvent(new ThreadPoolAddEvent(camelContext, threadPool, id, sourceId, routeId, threadPoolProfileId));
+        }
     }
 
     @Override
     public void onThreadPoolRemove(CamelContext camelContext, ThreadPoolExecutor threadPool) {
-        fireEvent(new ThreadPoolRemoveEvent(camelContext, threadPool));
+        if (observedLifecycleEvents.contains(ThreadPoolRemoveEvent.class.getName())) {
+            fireEvent(new ThreadPoolRemoveEvent(camelContext, threadPool));
+        }
     }
 
     @Override
     public void onServiceAdd(CamelContext context, Service service, org.apache.camel.Route route) {
-        fireEvent(new ServiceAddEvent(context, service, route));
+        if (observedLifecycleEvents.contains(ServiceAddEvent.class.getName())) {
+            fireEvent(new ServiceAddEvent(context, service, route));
+        }
     }
 
     @Override
     public void onServiceRemove(CamelContext context, Service service, org.apache.camel.Route route) {
-        fireEvent(new ServiceRemoveEvent(context, service, route));
+        if (observedLifecycleEvents.contains(ServiceAddEvent.class.getName())) {
+            fireEvent(new ServiceRemoveEvent(context, service, route));
+        }
     }
 
     @Override
@@ -121,25 +140,21 @@ public class CamelLifecycleEventBridge implements LifecycleStrategy {
 
     @Override
     public void onContextStop(CamelContext context) {
-
         // superseded by management events
     }
 
     @Override
     public void onRoutesAdd(Collection<Route> routes) {
-
         // superseded by management events
     }
 
     @Override
     public void onRoutesRemove(Collection<Route> routes) {
-
         // superseded by management events
     }
 
     @Override
     public void onRouteContextCreate(Route route) {
-
         // superseded by management events
     }
 
diff --git a/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelManagementEventBridge.java b/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelManagementEventBridge.java
index 980b847..94c45e4 100644
--- a/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelManagementEventBridge.java
+++ b/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelManagementEventBridge.java
@@ -16,6 +16,8 @@
  */
 package org.apache.camel.quarkus.core;
 
+import java.util.Set;
+
 import javax.enterprise.inject.spi.BeanManager;
 
 import io.quarkus.arc.Arc;
@@ -29,8 +31,13 @@ import org.apache.camel.support.EventNotifierSupport;
  * @see EventNotifier
  */
 public class CamelManagementEventBridge extends EventNotifierSupport {
+    private final Set<String> observedManagementEvents;
     private BeanManager beanManager;
 
+    public CamelManagementEventBridge(Set<String> observedManagementEvents) {
+        this.observedManagementEvents = observedManagementEvents;
+    }
+
     @Override
     protected void doInit() {
         beanManager = Arc.container().beanManager();
@@ -43,6 +50,6 @@ public class CamelManagementEventBridge extends EventNotifierSupport {
 
     @Override
     public boolean isEnabled(CamelEvent event) {
-        return true;
+        return observedManagementEvents.contains(event.getClass().getSimpleName());
     }
 }
diff --git a/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/main/CamelMainEventBridge.java b/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/main/CamelMainEventBridge.java
index 2128008..1522ca4 100644
--- a/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/main/CamelMainEventBridge.java
+++ b/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/main/CamelMainEventBridge.java
@@ -16,6 +16,7 @@
  */
 package org.apache.camel.quarkus.main;
 
+import java.util.Set;
 import java.util.function.Supplier;
 
 import javax.enterprise.inject.spi.BeanManager;
@@ -40,24 +41,32 @@ import org.apache.camel.util.function.Suppliers;
  */
 public class CamelMainEventBridge implements MainListener {
     private final Supplier<BeanManager> beanManager;
+    private final Set<String> observedMainEvents;
 
-    public CamelMainEventBridge() {
+    public CamelMainEventBridge(Set<String> observedMainEvents) {
         this.beanManager = Suppliers.memorize(Arc.container()::beanManager);
+        this.observedMainEvents = observedMainEvents;
     }
 
     @Override
     public void beforeInitialize(BaseMainSupport main) {
-        fireEvent(new BeforeInitialize(main));
+        if (observedMainEvents.contains(BeforeInitialize.class.getName())) {
+            fireEvent(new BeforeInitialize(main));
+        }
     }
 
     @Override
     public void beforeConfigure(BaseMainSupport main) {
-        fireEvent(new BeforeConfigure(main));
+        if (observedMainEvents.contains(BeforeConfigure.class.getName())) {
+            fireEvent(new BeforeConfigure(main));
+        }
     }
 
     @Override
     public void afterConfigure(BaseMainSupport main) {
-        fireEvent(new AfterConfigure(main));
+        if (observedMainEvents.contains(AfterConfigure.class.getName())) {
+            fireEvent(new AfterConfigure(main));
+        }
     }
 
     @Override
@@ -67,22 +76,30 @@ public class CamelMainEventBridge implements MainListener {
 
     @Override
     public void beforeStart(BaseMainSupport main) {
-        fireEvent(new BeforeStart(main));
+        if (observedMainEvents.contains(BeforeStart.class.getName())) {
+            fireEvent(new BeforeStart(main));
+        }
     }
 
     @Override
     public void afterStart(BaseMainSupport main) {
-        fireEvent(new AfterStart(main));
+        if (observedMainEvents.contains(AfterStart.class.getName())) {
+            fireEvent(new AfterStart(main));
+        }
     }
 
     @Override
     public void beforeStop(BaseMainSupport main) {
-        fireEvent(new BeforeStop(main));
+        if (observedMainEvents.contains(BeforeStop.class.getName())) {
+            fireEvent(new BeforeStop(main));
+        }
     }
 
     @Override
     public void afterStop(BaseMainSupport main) {
-        fireEvent(new AfterStop(main));
+        if (observedMainEvents.contains(AfterStop.class.getName())) {
+            fireEvent(new AfterStop(main));
+        }
     }
 
     private <T extends MainEvent> void fireEvent(T event) {
diff --git a/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/main/CamelMainRecorder.java b/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/main/CamelMainRecorder.java
index edba747..55e7651 100644
--- a/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/main/CamelMainRecorder.java
+++ b/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/main/CamelMainRecorder.java
@@ -17,6 +17,7 @@
 package org.apache.camel.quarkus.main;
 
 import java.util.List;
+import java.util.Set;
 
 import io.quarkus.arc.runtime.BeanContainer;
 import io.quarkus.runtime.RuntimeValue;
@@ -41,7 +42,6 @@ public class CamelMainRecorder {
             FailureRemedy failureRemedy) {
         CamelMain main = new CamelMain(runtime.getValue(), failureRemedy);
         main.setRoutesCollector(routesCollector.getValue());
-        main.addMainListener(new CamelMainEventBridge());
 
         // properties are loaded through MicroProfile Config so there's
         // no need to look for sources.
@@ -95,4 +95,8 @@ public class CamelMainRecorder {
 
         return new RuntimeValue<>(runtime);
     }
+
+    public void registerCamelMainEventBridge(RuntimeValue<CamelMain> main, Set<String> observedMainEvents) {
+        main.getValue().addMainListener(new CamelMainEventBridge(observedMainEvents));
+    }
 }
diff --git a/extensions/micrometer/deployment/src/test/java/org/apache/camel/quarkus/component/micrometer/deployment/MicrometerMetricsConfigDefaultsTest.java b/extensions/micrometer/deployment/src/test/java/org/apache/camel/quarkus/component/micrometer/deployment/MicrometerMetricsConfigDefaultsTest.java
index 0131b0c..2a1f088 100644
--- a/extensions/micrometer/deployment/src/test/java/org/apache/camel/quarkus/component/micrometer/deployment/MicrometerMetricsConfigDefaultsTest.java
+++ b/extensions/micrometer/deployment/src/test/java/org/apache/camel/quarkus/component/micrometer/deployment/MicrometerMetricsConfigDefaultsTest.java
@@ -56,6 +56,6 @@ public class MicrometerMetricsConfigDefaultsTest {
         assertTrue(messageHistoryFactory instanceof DefaultMessageHistoryFactory);
 
         List<EventNotifier> eventNotifiers = context.getManagementStrategy().getEventNotifiers();
-        assertEquals(3, eventNotifiers.size());
+        assertEquals(2, eventNotifiers.size());
     }
 }
diff --git a/extensions/micrometer/deployment/src/test/java/org/apache/camel/quarkus/component/micrometer/deployment/MicrometerMetricsConfigOverrideTest.java b/extensions/micrometer/deployment/src/test/java/org/apache/camel/quarkus/component/micrometer/deployment/MicrometerMetricsConfigOverrideTest.java
index 6867a78..16b9651 100644
--- a/extensions/micrometer/deployment/src/test/java/org/apache/camel/quarkus/component/micrometer/deployment/MicrometerMetricsConfigOverrideTest.java
+++ b/extensions/micrometer/deployment/src/test/java/org/apache/camel/quarkus/component/micrometer/deployment/MicrometerMetricsConfigOverrideTest.java
@@ -19,7 +19,6 @@ package org.apache.camel.quarkus.component.micrometer.deployment;
 import java.io.IOException;
 import java.io.StringWriter;
 import java.io.Writer;
-import java.util.List;
 import java.util.Properties;
 
 import javax.inject.Inject;
@@ -27,8 +26,6 @@ import javax.inject.Inject;
 import io.quarkus.test.QuarkusUnitTest;
 import org.apache.camel.CamelContext;
 import org.apache.camel.component.micrometer.messagehistory.MicrometerMessageHistoryFactory;
-import org.apache.camel.quarkus.core.CamelManagementEventBridge;
-import org.apache.camel.spi.EventNotifier;
 import org.apache.camel.spi.MessageHistoryFactory;
 import org.jboss.shrinkwrap.api.ShrinkWrap;
 import org.jboss.shrinkwrap.api.asset.Asset;
@@ -37,7 +34,6 @@ import org.jboss.shrinkwrap.api.spec.JavaArchive;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
-import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
@@ -58,11 +54,6 @@ public class MicrometerMetricsConfigOverrideTest {
         MessageHistoryFactory messageHistoryFactory = context.getMessageHistoryFactory();
         assertNotNull(messageHistoryFactory);
         assertTrue(messageHistoryFactory instanceof MicrometerMessageHistoryFactory);
-
-        // There should always be one event notifier added by core for CamelManagementEventBridge
-        List<EventNotifier> eventNotifiers = context.getManagementStrategy().getEventNotifiers();
-        assertEquals(1, eventNotifiers.size());
-        assertTrue(eventNotifiers.get(0) instanceof CamelManagementEventBridge);
     }
 
     public static final Asset applicationProperties() {
diff --git a/extensions/micrometer/deployment/src/test/java/org/apache/camel/quarkus/component/micrometer/deployment/MicrometerMetricsDisabledTest.java b/extensions/micrometer/deployment/src/test/java/org/apache/camel/quarkus/component/micrometer/deployment/MicrometerMetricsDisabledTest.java
index 9583704..22b1d79 100644
--- a/extensions/micrometer/deployment/src/test/java/org/apache/camel/quarkus/component/micrometer/deployment/MicrometerMetricsDisabledTest.java
+++ b/extensions/micrometer/deployment/src/test/java/org/apache/camel/quarkus/component/micrometer/deployment/MicrometerMetricsDisabledTest.java
@@ -27,8 +27,6 @@ import javax.inject.Inject;
 import io.quarkus.test.QuarkusUnitTest;
 import org.apache.camel.CamelContext;
 import org.apache.camel.impl.engine.DefaultMessageHistoryFactory;
-import org.apache.camel.quarkus.core.CamelManagementEventBridge;
-import org.apache.camel.spi.EventNotifier;
 import org.apache.camel.spi.MessageHistoryFactory;
 import org.apache.camel.spi.RoutePolicyFactory;
 import org.jboss.shrinkwrap.api.ShrinkWrap;
@@ -38,7 +36,6 @@ import org.jboss.shrinkwrap.api.spec.JavaArchive;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
-import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
@@ -60,11 +57,6 @@ public class MicrometerMetricsDisabledTest {
         MessageHistoryFactory messageHistoryFactory = context.getMessageHistoryFactory();
         assertNotNull(messageHistoryFactory);
         assertTrue(messageHistoryFactory instanceof DefaultMessageHistoryFactory);
-
-        // There should always be one event notifier added by core for CamelManagementEventBridge
-        List<EventNotifier> eventNotifiers = context.getManagementStrategy().getEventNotifiers();
-        assertEquals(1, eventNotifiers.size());
-        assertTrue(eventNotifiers.get(0) instanceof CamelManagementEventBridge);
     }
 
     public static final Asset applicationProperties() {
diff --git a/extensions/microprofile-metrics/deployment/src/test/java/org/apache/camel/quarkus/component/microprofile/metrics/deployment/MicroProfileMetricsConfigDefaultsTest.java b/extensions/microprofile-metrics/deployment/src/test/java/org/apache/camel/quarkus/component/microprofile/metrics/deployment/MicroProfileMetricsConfigDefaultsTest.java
index 844c8c3..bf22d1d 100644
--- a/extensions/microprofile-metrics/deployment/src/test/java/org/apache/camel/quarkus/component/microprofile/metrics/deployment/MicroProfileMetricsConfigDefaultsTest.java
+++ b/extensions/microprofile-metrics/deployment/src/test/java/org/apache/camel/quarkus/component/microprofile/metrics/deployment/MicroProfileMetricsConfigDefaultsTest.java
@@ -56,6 +56,6 @@ public class MicroProfileMetricsConfigDefaultsTest {
         assertTrue(messageHistoryFactory instanceof DefaultMessageHistoryFactory);
 
         List<EventNotifier> eventNotifiers = context.getManagementStrategy().getEventNotifiers();
-        assertEquals(4, eventNotifiers.size());
+        assertEquals(3, eventNotifiers.size());
     }
 }
diff --git a/extensions/microprofile-metrics/deployment/src/test/java/org/apache/camel/quarkus/component/microprofile/metrics/deployment/MicroProfileMetricsConfigOverrideTest.java b/extensions/microprofile-metrics/deployment/src/test/java/org/apache/camel/quarkus/component/microprofile/metrics/deployment/MicroProfileMetricsConfigOverrideTest.java
index 2b6b740..8f27318 100644
--- a/extensions/microprofile-metrics/deployment/src/test/java/org/apache/camel/quarkus/component/microprofile/metrics/deployment/MicroProfileMetricsConfigOverrideTest.java
+++ b/extensions/microprofile-metrics/deployment/src/test/java/org/apache/camel/quarkus/component/microprofile/metrics/deployment/MicroProfileMetricsConfigOverrideTest.java
@@ -19,7 +19,6 @@ package org.apache.camel.quarkus.component.microprofile.metrics.deployment;
 import java.io.IOException;
 import java.io.StringWriter;
 import java.io.Writer;
-import java.util.List;
 import java.util.Properties;
 
 import javax.inject.Inject;
@@ -27,8 +26,6 @@ import javax.inject.Inject;
 import io.quarkus.test.QuarkusUnitTest;
 import org.apache.camel.CamelContext;
 import org.apache.camel.component.microprofile.metrics.message.history.MicroProfileMetricsMessageHistoryFactory;
-import org.apache.camel.quarkus.core.CamelManagementEventBridge;
-import org.apache.camel.spi.EventNotifier;
 import org.apache.camel.spi.MessageHistoryFactory;
 import org.jboss.shrinkwrap.api.ShrinkWrap;
 import org.jboss.shrinkwrap.api.asset.Asset;
@@ -37,7 +34,6 @@ import org.jboss.shrinkwrap.api.spec.JavaArchive;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
-import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
@@ -58,11 +54,6 @@ public class MicroProfileMetricsConfigOverrideTest {
         MessageHistoryFactory messageHistoryFactory = context.getMessageHistoryFactory();
         assertNotNull(messageHistoryFactory);
         assertTrue(messageHistoryFactory instanceof MicroProfileMetricsMessageHistoryFactory);
-
-        // There should always be one event notifier added by core for CamelManagementEventBridge
-        List<EventNotifier> eventNotifiers = context.getManagementStrategy().getEventNotifiers();
-        assertEquals(1, eventNotifiers.size());
-        assertTrue(eventNotifiers.get(0) instanceof CamelManagementEventBridge);
     }
 
     public static final Asset applicationProperties() {