JMX connector: supply classloader for OSGi bundle
Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/4e078265 Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/4e078265 Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/4e078265 Branch: refs/heads/master Commit: 4e078265b3cf278cc8f520e2e902ebd044476e18 Parents: 1f2e2a1 Author: Aled Sage <[email protected]> Authored: Tue Jul 5 20:25:33 2016 +0100 Committer: Aled Sage <[email protected]> Committed: Wed Jul 6 11:30:42 2016 +0100 ---------------------------------------------------------------------- karaf/features/src/main/feature/feature.xml | 2 +- .../org/apache/brooklyn/feed/jmx/JmxHelper.java | 24 +++++++++++++++++--- 2 files changed, 22 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/4e078265/karaf/features/src/main/feature/feature.xml ---------------------------------------------------------------------- diff --git a/karaf/features/src/main/feature/feature.xml b/karaf/features/src/main/feature/feature.xml index 057cd3b..b1d7923 100644 --- a/karaf/features/src/main/feature/feature.xml +++ b/karaf/features/src/main/feature/feature.xml @@ -211,9 +211,9 @@ <feature name="brooklyn-software-base" version="${project.version}" description="Brooklyn Software Base"> <bundle>mvn:org.apache.brooklyn/brooklyn-software-base/${project.version}</bundle> + <bundle dependency="true">wrap:mvn:org.glassfish.external/opendmk_jmxremote_optional_jar/${opendmk_jmxremote_optional_jar.version}</bundle> <feature>brooklyn-software-winrm</feature> <feature>brooklyn-policy</feature> - <!-- python dependency required but not supported since karaf cannot handle its runtime bindings --> </feature> <feature name="brooklyn-jmxmp-agent" version="${project.version}" description="Brooklyn Secure JMXMP Agent"> http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/4e078265/software/base/src/main/java/org/apache/brooklyn/feed/jmx/JmxHelper.java ---------------------------------------------------------------------- diff --git a/software/base/src/main/java/org/apache/brooklyn/feed/jmx/JmxHelper.java b/software/base/src/main/java/org/apache/brooklyn/feed/jmx/JmxHelper.java index d3af18c..d29dee0 100644 --- a/software/base/src/main/java/org/apache/brooklyn/feed/jmx/JmxHelper.java +++ b/software/base/src/main/java/org/apache/brooklyn/feed/jmx/JmxHelper.java @@ -20,7 +20,6 @@ package org.apache.brooklyn.feed.jmx; import static com.google.common.base.Preconditions.checkNotNull; import static org.apache.brooklyn.util.JavaGroovyEquivalents.groovyTruth; -import groovy.time.TimeDuration; import java.io.IOException; import java.security.KeyStore; @@ -63,6 +62,7 @@ import javax.net.ssl.TrustManager; import org.apache.brooklyn.api.entity.EntityLocal; import org.apache.brooklyn.entity.java.JmxSupport; import org.apache.brooklyn.entity.java.UsesJmx; +import org.apache.brooklyn.util.collections.MutableMap; import org.apache.brooklyn.util.core.crypto.SecureKeys; import org.apache.brooklyn.util.crypto.SslTrustUtils; import org.apache.brooklyn.util.exceptions.Exceptions; @@ -80,6 +80,8 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; +import groovy.time.TimeDuration; + public class JmxHelper { private static final Logger LOG = LoggerFactory.getLogger(JmxHelper.class); @@ -272,7 +274,7 @@ public class JmxHelper { JMXServiceURL serviceUrl = new JMXServiceURL(url); Map env = getConnectionEnvVars(); try { - connector = JMXConnectorFactory.connect(serviceUrl, env); + connector = newConnector(serviceUrl, env); } catch (NullPointerException npe) { //some software -- eg WSO2 -- will throw an NPE exception if the JMX connection can't be created, instead of an IOException. //this is a break of contract with the JMXConnectorFactory.connect method, so this code verifies if the NPE is @@ -300,9 +302,25 @@ public class JmxHelper { } } + /** + * Handles loading the {@link JMXConnector} in OSGi, where we need to supply the classloader. + */ + public static JMXConnector newConnector(JMXServiceURL url, Map<String, ?> env) throws IOException { + Map<String, Object> envCopy = MutableMap.copyOf(env); + String protocol = url.getProtocol(); + if ("jmxmp".equalsIgnoreCase(protocol)) { + envCopy.put(JMXConnectorFactory.PROTOCOL_PROVIDER_CLASS_LOADER, javax.management.remote.jmxmp.JMXMPConnector.class.getClassLoader()); + envCopy.put(JMXConnectorFactory.DEFAULT_CLASS_LOADER, javax.management.remote.jmxmp.JMXMPConnector.class.getClassLoader()); + } else if ("rmi".equalsIgnoreCase(protocol)) { + envCopy.put(JMXConnectorFactory.PROTOCOL_PROVIDER_CLASS_LOADER, javax.management.remote.rmi.RMIConnector.class.getClassLoader()); + envCopy.put(JMXConnectorFactory.DEFAULT_CLASS_LOADER, javax.management.remote.rmi.RMIConnector.class.getClassLoader()); + } + return JMXConnectorFactory.connect(url, envCopy); + } + @SuppressWarnings({ "rawtypes", "unchecked" }) public Map getConnectionEnvVars() { - Map env = new LinkedHashMap(); + Map<String, Object> env = new LinkedHashMap(); if (groovyTruth(user) && groovyTruth(password)) { String[] creds = new String[] {user, password};
