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 <claus.ib...@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); }