+

Search Tips   |   Advanced Search

 

Develop a Java Management Extensions client program using Java Management Extensions Remote application programming interface

 

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.

 

Overview

You can administer your WAS environment through the console, the wsadmin utility, or Java Management Extensions (JMX) programming. This topic discusses how to develop a JMX remote client program using the JMX remote API so that you can administer your WebSphere Application Server environment through JMX programming.

 

Procedure

  1. Specify the JMX connector address for the server through the JMXServiceURL class.

    The form of the JMXServiceURL class is service:jmx:rmi://host name:port/jndi/JMXConnector

  2. Specify the user ID and password for the server, if security is enabled.

  3. Establish the JMX connection.

  4. Get the MBean server connection instance.

 

Results

You have established a connection to WAS through an RMI connection and started the WAS through the node agent.

 

Example

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) {
      }   }

}



Creating a Java Management Extensions client program using the Java Management Extensions Remote application programming interface
Use application clients