This topic describes how to develop a Java Management Extensions (JMX) connector specification and JMX Remote application programming interface (API) (JSR 160). The program can communicate by Remote Method Invocation over Internet Inter-ORB Protocol (RMI-IIOP) This topic assumes a basic understanding of JSR 160, JMX APIs, and managed beans (MBeans). For more information on JSR 160, see http://www.jcp.org/en/jsr/detail?id=160. For more information on the JMX APIs, see the JMX API documentation. For more information on MBeans, see the MBean API documentation.
The form of the JMXServiceURL class is service:jmx:rmi://host name:port/jndi/JMXConnector
The following example is for a thin application client.
import java.util.Date; import java.util.Set; import java.util.Hashtable; import javax.management.InstanceNotFoundException; import javax.management.MalformedObjectNameException; import javax.management.Notification; import javax.management.NotificationListener; import javax.management.ObjectName; import javax.management.MBeanServerConnection; import javax.management.remote.JMXConnector; import javax.management.remote.JMXConnectorFactory; import javax.management.remote.JMXServiceURL; public class JMXRemoteClientApp implements NotificationListener { private MBeanServerConnection mbsc = null; private ObjectName nodeAgent; private long ntfyCount = 0; public static void main(String[] args) { try { JMXRemoteClientApp client = new JMXRemoteClientApp(); String hostname=args[0]; String port=args[1]; String nodeName =args[2]; client.connect(hostname,port); // Find a node agent MBean client.getNodeAgentMBean(nodeName); // Invoke the launch process. client.invokeLaunchProcess("server1"); // Register for node agent events client.registerNotificationListener(); // Run until interrupted. client.countNotifications(); } catch (Exception e) { e.printStackTrace(); } } private void connect(String hostname,String port) throws Exception { String jndiPath="/jndi/JMXConnector"; JMXServiceURL url = new JMXServiceURL("service:jmx:iiop://"+hostname+":"+port+jndiPath); Hashtable h = new Hashtable(); //Specify the user ID and password for the server if security is enabled on server. // String[] credentials = new String[] {username ,password }; //h.put("jmx.remote.credentials", credentials); //Establish the JMX connection. JMXConnector jmxc = JMXConnectorFactory.connect(url, h); //Get the MBean server connection instance. mbsc = jmxc.getMBeanServerConnection(); System.out.println("Connected to DeploymentManager"); } private void getNodeAgentMBean(String nodeName) { // Query for the object name of the node agent MBean on the given node try { String query = "WebSphere:type=NodeAgent,node=" + nodeName + ",*"; ObjectName queryName = new ObjectName(query); Set s = mbsc.queryNames(queryName, null); if (!s.isEmpty()) nodeAgent = (ObjectName)s.iterator().next(); else { System.out.println("Node agent MBean was not found"); System.exit(-1); } } catch (Exception e) { System.out.println(e); System.exit(-1); } System.out.println("Found NodeAgent MBean for node " + nodeName); } private void invokeLaunchProcess(String serverName) { // Use the launch process on the node agent MBean to start // the given server. String opName = "launchProcess"; String signature[] = { "java.lang.String"}; String params[] = { serverName}; boolean launched = false; try { Boolean b = (Boolean)mbsc.invoke(nodeAgent, opName, params, signature); launched = b.booleanValue(); if (launched) System.out.println(serverName + " was launched"); else System.out.println(serverName + " was not launched"); } catch (Exception e) { System.out.println("Exception invoking launchProcess: " + e); } } private void registerNotificationListener() { // Register this object as a listener for notifications from the // node agent MBean. Do not use a filter and do not use a handback // object. try { mbsc.addNotificationListener(nodeAgent, this, null, null); System.out.println("Registered for event notifications"); } catch (Exception e) { System.out.println(e); } } public void handleNotification(Notification ntfyObj, Object handback) { // Each notification that the node agent MBean generates results in // a call to this method. ntfyCount++; System.out.println("***************************************************"); System.out.println("* Notification received at " + new Date().toString()); System.out.println("* type = " + ntfyObj.getType()); System.out.println("* message = " + ntfyObj.getMessage()); System.out.println("* source = " + ntfyObj.getSource()); System.out.println( "* seqNum = " + Long.toString(ntfyObj.getSequenceNumber())); System.out.println("* timeStamp = " + new Date(ntfyObj.getTimeStamp())); System.out.println("* userData = " + ntfyObj.getUserData()); System.out.println("***************************************************"); } private void countNotifications() { // Run until stopped. try { while (true) { Thread.currentThread().sleep(60000); System.out.println(ntfyCount + " notification have been received"); } } catch (InterruptedException e) { } } }