WAS v8.5 > Administer applications and their environment > Use the administrative clients > Use administrative programs (JMX) > Create a Java Management Extensions client program using the Java Management Extensions Remote application programming interface

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 API (JSR 160). The program can communicate by RMI-IIOP

This topic assumes a basic understanding of JSR 160, JMX APIs, and managed beans (MBeans). For more information on JSR 1.0, see the JSR 160: JMX Remote API at http://www.jcp.org/en/jsr/detail?id=160. For more information on the JMX APIs and on MBeans, view the application programming interfaces documentation. We can administer your WebSphere Application Server environment through the dmgr console, the wsadmin utility, or Java Management Extensions (JMX) programming. Complete this task to develop a JMX remote client program using the JMX remote API so that we can administer the environment through JMX programming.

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

    The value of the JMX service URL is:

      service:jmx:rmi://" + host + ":" + port + "/jndi/JMXConnector"
    For example, if the target server host is sales.xyz.com and the listening port is 1234, the JMX service URL is:

      service:jmx:rmi://sales.xyz.com:1234/jndi/JMXConnector

    We can find the value for port in the Ports table of the console server settings page or in the serverindex.xml file that includes the target server. If the URL does not specify a value for host, the product uses the default value of localhost. If the URL does not specify a value for port, the product uses the default value of 2809.

    When connecting to an administrative agent, add the administrative agent JMX connector port number to the end of the URL. For example, if the administrative agent JMX connector host is sales.xyz.com and the port is 6789, then use the following URL:

      service:jmx:rmi://sales.xyz.com:6789/jndi/JMXConnector6789

  2. Set the JNDI provider URL property to use the administrative name service for the product.

    The JNDI provider URL property is javax.naming.Context.PROVIDER_URL. The administrative name service is WsnAdminNameService.

  3. If the client uses security, set the -Dcom.ibm.CORBA.ConfigURL and -Dcom.ibm.SSL.ConfigURL system properties in the client JVM.

    Without the -Dcom.ibm.CORBA.ConfigURL and -Dcom.ibm.SSL.ConfigURL system properties set to valid system properties files, the client does not work properly when security is enabled. The recommended way to run the JMX connector client is as an administrative thin client.

    Typically, we can copy the properties files from an installation profile directory, preferably from the target server profile directory.

  4. Specify the user ID and password for the server, if security is enabled.
  5. Establish the JMX connection.
  6. Get the MBean server connection instance.


Example

Use the following thin client code example to create and use the JMX client.

Some statements are split on multiple lines for printing purposes.

import java.io.File;
import java.util.Date;
import java.util.Set;
import java.util.Hashtable;

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 ObjectName jvm;
   private long ntfyCount = 0;
   private static String userid = null;
   private static String pwd = null;

   public static void main(String[] args)
   {
      try {

         JMXRemoteClientApp client = new JMXRemoteClientApp();

         String host=args[0];
         String port=args[1];
         String nodeName =args[2];
         userid =args[3];
         pwd = args[4];

         client.connect(host,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 host,String port) throws Exception    {
      String jndiPath="/WsnAdminNameService#JMXConnector";

      JMXServiceURL url =
        new JMXServiceURL("service:jmx:iiop://"+host+"/jndi/corbaname:iiop:"+host+":"+port+jndiPath);

      Hashtable h  = new Hashtable();

      //Specify the user ID and password for the server if security is enabled on server.

      System.out.println("Userid is " + userid);
      System.out.println("Password is " + pwd);
      if ((userid.length() != 0) && (pwd.length() != 0)) {
             System.out.println("adding userid and password to credentials...");
             String[] credentials = new String[] {userid , pwd }; 
             h.put("jmx.remote.credentials", credentials);
      } else {
             System.out.println("No credentials provided.");
      }


      //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();
                System.out.println("NodeAgent mbean found "+ nodeAgent.toString());
         } else {
            System.out.println("Node agent MBean was not found");
            System.exit(-1);
         }
      } catch (Exception e) {
         System.out.println(e);
         System.exit(-1);
      }
   }
   
  
   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 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) {
      }
   }
}


Related concepts:

Additional Application Programming Interfaces (APIs)


Related


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


Related information:

http://www.jcp.org/en/jsr/detail?id=160


+

Search Tips   |   Advanced Search