Accessing WildFly JMX Bus Remotely with novaordis-jmx: Difference between revisions

From NovaOrdis Knowledge Base
Jump to navigation Jump to search
Line 66: Line 66:
A more generic way to connect to a JMX server, where it is assumed that an implementation of ClientProvider class is available in classpath:
A more generic way to connect to a JMX server, where it is assumed that an implementation of ClientProvider class is available in classpath:


<font color=red>TODO</font>
<pre>
 
JMXServiceURL jmxServiceURL = new JMXServiceURL(<protocol>, host, port);
 
Map<String, String> environment = new HashMap<>();
 
environment.put("jmx.remote.protocol.provider.pkgs", <a-package-that-contains-a-subpackage-named-after-the-protocol-which-in-turn-contains-a-ClientProvider-class>);
 
JMXConnector jmxConnector = JMXConnectorFactory.connect(jmxServiceURL, environment);
 
MBeanServerConnection mBeanServerConnection = jmxConnector.getMBeanServerConnection();
 
mBeanServerConnection.getMBeanCount();
 
</pre>

Revision as of 05:20, 19 June 2017

Internal

Overview

The WildFly JMX bus can be accessed programmatically using standard JMX remoting API, as described in the Remote Access to a JMX Server section. novaordis-jmx is a library that provides a thin layer of functionality in top of the client-side JMX remoting API, with the intention to facilitate programmatic JMX access to a remote JMX bus. Note that novaordis-imx is NOT necessary for programmatic JMX access, but its code introduces a certain degree of convenience, and it can be used as an example for direct use of the JMX remote API.

Classpath

EAP 6 Classpath

EAP 6 exposes the JMX bus over its remoting protocol, so the JMX client needs JBoss remoting support in its classpath, which is available in ${JBOSS_HOME}/bin/client/jboss-cli-client.jar.

java ... -cp ...:${JBOSS_HOME}/bin/client/jboss-cli-client.jar:...

EAP 7 Classpath

URL

The protocol to use for EAP 6 is "remoting-jmx". novaordis-jmx builds a javax.management.remote.JMXServiceURL which in turn prepends automatically "service:imx" and sends "service:jmx:remoting-jmx://<host>:<port>" to the underlying JMX logic.

JMXServiceURL jmxServiceURL = new JMXServiceURL("remoting-jmx", host, port);

novaordis-jmx API


JmxAddress address  = new JmxAddress("jmx://localhost:9999");

address.setJmxServiceUrlProtocol("remoting-jmx");

JmxClient client = new JmxClient(address);

client.connect();

MBeanServerConnection mBeanServerConnection = client.getMBeanServerConnection();

mBeanServerConnection.getMBeanCount();

Example:

https://github.com/NovaOrdis/novaordis-jmx/blob/master/src/main/java/io/novaordis/jmx/Main.java

Underlying JMX API


JMXServiceURL jmxServiceURL = new JMXServiceURL("remoting-jmx", host, port);

JMXConnector jmxConnector = JMXConnectorFactory.connect(jmxServiceURL);

MBeanServerConnection mBeanServerConnection = jmxConnector.getMBeanServerConnection();

mBeanServerConnection.getMBeanCount();

Alternative JMX API

A more generic way to connect to a JMX server, where it is assumed that an implementation of ClientProvider class is available in classpath:


JMXServiceURL jmxServiceURL = new JMXServiceURL(<protocol>, host, port);

Map<String, String> environment = new HashMap<>();

environment.put("jmx.remote.protocol.provider.pkgs", <a-package-that-contains-a-subpackage-named-after-the-protocol-which-in-turn-contains-a-ClientProvider-class>);

JMXConnector jmxConnector = JMXConnectorFactory.connect(jmxServiceURL, environment);

MBeanServerConnection mBeanServerConnection = jmxConnector.getMBeanServerConnection();

mBeanServerConnection.getMBeanCount();