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/08/23 20:03:27 UTC

[camel] branch master updated: CAMEL-13904: JMX - Early registered services may not be enlisted in XML DSL

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


The following commit(s) were added to refs/heads/master by this push:
     new 0bd3087  CAMEL-13904: JMX - Early registered services may not be enlisted in XML DSL
0bd3087 is described below

commit 0bd3087d6477dc80709094b43326b159531b25f1
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Fri Aug 23 20:33:50 2019 +0200

    CAMEL-13904: JMX - Early registered services may not be enlisted in XML DSL
---
 .../core/xml/AbstractCamelContextFactoryBean.java  | 11 +++++++----
 .../management/JmxManagementLifecycleStrategy.java | 14 ++++++++++++-
 .../management/JmxManagementStrategyFactory.java   | 23 ++++++++++++++++++++++
 3 files changed, 43 insertions(+), 5 deletions(-)

diff --git a/core/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java b/core/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java
index a1e4b3b..8fbc61d 100644
--- a/core/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java
+++ b/core/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java
@@ -181,9 +181,9 @@ public abstract class AbstractCamelContextFactoryBean<T extends ModelCamelContex
             mergedOptions.putAll(getGlobalOptions().asMap());
         }
 
-        getContext().setGlobalOptions(mergedOptions);
-
-        setupCustomServices();
+        if (!mergedOptions.isEmpty()) {
+            getContext().setGlobalOptions(mergedOptions);
+        }
 
         // set the custom registry if defined
         initCustomRegistry(getContext());
@@ -191,9 +191,12 @@ public abstract class AbstractCamelContextFactoryBean<T extends ModelCamelContex
         // setup property placeholder so we got it as early as possible
         initPropertyPlaceholder();
 
-        // setup JMX agent at first
+        // then setup JMX
         initJMXAgent();
 
+        // setup all misc services
+        setupCustomServices();
+
         BacklogTracer backlogTracer = getBeanForType(BacklogTracer.class);
         if (backlogTracer != null) {
             LOG.info("Using custom BacklogTracer: {}", backlogTracer);
diff --git a/core/camel-management-impl/src/main/java/org/apache/camel/management/JmxManagementLifecycleStrategy.java b/core/camel-management-impl/src/main/java/org/apache/camel/management/JmxManagementLifecycleStrategy.java
index 80fa529..e3e6c15 100644
--- a/core/camel-management-impl/src/main/java/org/apache/camel/management/JmxManagementLifecycleStrategy.java
+++ b/core/camel-management-impl/src/main/java/org/apache/camel/management/JmxManagementLifecycleStrategy.java
@@ -142,6 +142,18 @@ public class JmxManagementLifecycleStrategy extends ServiceSupport implements Li
         this.camelContext = camelContext;
     }
 
+    // used for handing over pre-services between a provisional lifecycycle strategy
+    // and then later the actual strategy to be used when using XML
+    List<PreRegisterService> getPreServices() {
+        return preServices;
+    }
+
+    // used for handing over pre-services between a provisional lifecycycle strategy
+    // and then later the actual strategy to be used when using XML
+    void addPreService(PreRegisterService preService) {
+        preServices.add(preService);
+    }
+
     @Override
     public CamelContext getCamelContext() {
         return camelContext;
@@ -1011,7 +1023,7 @@ public class JmxManagementLifecycleStrategy extends ServiceSupport implements Li
      *
      * @see JmxManagementLifecycleStrategy#enlistPreRegisteredServices()
      */
-    private static final class PreRegisterService {
+    public static final class PreRegisterService {
 
         private String name;
         private Component component;
diff --git a/core/camel-management-impl/src/main/java/org/apache/camel/management/JmxManagementStrategyFactory.java b/core/camel-management-impl/src/main/java/org/apache/camel/management/JmxManagementStrategyFactory.java
index fbabb31..dee2c0e 100644
--- a/core/camel-management-impl/src/main/java/org/apache/camel/management/JmxManagementStrategyFactory.java
+++ b/core/camel-management-impl/src/main/java/org/apache/camel/management/JmxManagementStrategyFactory.java
@@ -16,9 +16,12 @@
  */
 package org.apache.camel.management;
 
+import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.Service;
 import org.apache.camel.spi.LifecycleStrategy;
 import org.apache.camel.spi.ManagementStrategy;
 import org.apache.camel.spi.ManagementStrategyFactory;
@@ -49,6 +52,26 @@ public class JmxManagementStrategyFactory implements ManagementStrategyFactory {
         camelContext.setManagementStrategy(strategy);
         // must add management lifecycle strategy as first choice
         if (!camelContext.getLifecycleStrategies().isEmpty()) {
+
+            // a bit of ugly code to handover pre registered services that has been add to an eager/provisional JmxManagementLifecycleStrategy
+            // which is now re-placed with a new JmxManagementLifecycleStrategy that is based on the end user configured settings
+            // and therefore will be in use
+            List<JmxManagementLifecycleStrategy.PreRegisterService> preServices = null;
+            JmxManagementLifecycleStrategy jmx = camelContext.getLifecycleStrategies().stream()
+                    .filter(s -> s instanceof JmxManagementLifecycleStrategy)
+                    .map(JmxManagementLifecycleStrategy.class::cast)
+                    .findFirst().orElse(null);
+            if (jmx != null) {
+                preServices = jmx.getPreServices();
+            }
+
+            if (preServices != null &&  !preServices.isEmpty() && lifecycle instanceof JmxManagementLifecycleStrategy) {
+                JmxManagementLifecycleStrategy existing = (JmxManagementLifecycleStrategy) lifecycle;
+                for (JmxManagementLifecycleStrategy.PreRegisterService pre : preServices) {
+                    existing.addPreService(pre);
+                }
+            }
+
             // camel-spring/camel-blueprint may re-initialize JMX during startup, so remove any previous
             camelContext.getLifecycleStrategies().removeIf(s -> s instanceof JmxManagementLifecycleStrategy);
         }