Desarrollo de un programa cliente de Java Management Extensions utilizando la interfaz de programas de aplicación remota de Java Management Extensions

Puede desarrollar una especificación de conector JMX (Java™ Management Extensions) y una interfaz de programación de aplicación (API) remota JMX (JSR 160). El programa puede comunicarse mediante RMI-IIOP (Remote Method Invocation over Internet Inter-ORB Protocol)

Antes de empezar

Obtenga información sobre JSR 160, API de JMX, y beans gestionados (MBeans). Para obtener más información sobre JSR 160, consulte "JSR 160: Java Management Extensions (JMX) Remote API", en http://www.jcp.org/en/jsr/detail?id=160. Para obtener información acerca de las API de JMX, consulte la documentación de las interfaces de programación de aplicaciones.

Acerca de esta tarea

Puede administrar el entorno de WebSphere Application Server mediante la consola de administración, el programa de utilidad wsadmin o la programación de JMX (Java Management Extensions). Realice esta tarea para desarrollar un programa cliente remoto de JMX utilizando la API remota de JMX para que pueda administrar el entorno mediante la programación de JMX.

Procedimiento

  1. Especifique la dirección del conector JMX para el servidor a través de la clase JMXServiceURL.
    El valor del URL del servicio JMX es:
    service:jmx:rmi://" + host + ":" + puerto + "/jndi/JMXConnector"
    Por ejemplo, si el host del servidor de destino es sales.xyz.com y el puerto de escucha es 1234, el URL del servicio JMX es:
    service:jmx:rmi://sales.xyz.com:1234/jndi/JMXConnector

    Puede encontrar el valor de puerto en la tabla Puertos de la página de valores del servidor de la consola o en el archivo serverindex.xml que incluye el servidor de destino. Si el URL no especifica un valor para host, el producto utiliza el valor predeterminado de localhost. Si el URL no especifica un valor para puerto, el producto utiliza el valor predeterminado de 2809.

    Cuando se conecta a un agente administrativo, añada el número de puerto del conector JMX del agente administrativo al final del URL. Por ejemplo, si el host del conector JMX del agente administrativo es sales.xyz.com y el puerto es 6789, utilice el URL siguiente:
    service:jmx:rmi://sales.xyz.com:6789/jndi/JMXConnector6789
  2. Establezca la propiedad de URL del proveedor JNDI (Java Naming and Directory Interface) para utilizar el servicio de nombre administrativo del producto.

    La propiedad de URL de proveedor JNDI es javax.naming.Context.PROVIDER_URL. El servicio de nombre administrativo es WsnAdminNameService.

  3. Si el cliente utiliza la seguridad, establezca las propiedades del sistema -Dcom.ibm.CORBA.ConfigURL y -Dcom.ibm.SSL.ConfigURL en la máquina virtual Java (JVM) del cliente.

    Si las propiedades del sistema -Dcom.ibm.CORBA.ConfigURL y -Dcom.ibm.SSL.ConfigURL no están establecidas en archivos de propiedades del sistema válidos, el cliente no funciona correctamente cuando la seguridad está habilitada. El método recomendado para ejecutar el cliente del conector JMX es como un cliente ligero administrativo.

    Normalmente, puede copiar los archivos de propiedades de un directorio de perfil de instalación, preferiblemente del directorio de perfil de servidor de destino.

  4. Especifique el ID de usuario y la contraseña para el servidor, si la seguridad está habilitada.
  5. Establezca la conexión JMX.
  6. Obtenga la instancia de conexión de servidor MBean.

Resultados

Se ha establecido una conexión con el gestor de despliegue a través de una conexión RMI y se ha iniciado el servidor de aplicaciones mediante el MBean del agente de nodo.

Ejemplo

Utilice el siguiente código de cliente ligero de ejemplo para crear y utilizar el cliente JMX.

Algunas sentencias están partidas en varias líneas para fines de impresión.

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);

         // Buscar un MBean del agente de nodo
         client.getNodeAgentMBean(nodeName);

         // Invocar el proceso de inicio.
         client.invokeLaunchProcess("server1");

         // Registrar los sucesos del agente de nodo
         client.registerNotificationListener();

         // Ejecutar hasta que se interrumpa.
         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();

      //Especificar el ID de usuario y la contraseña para el servidor si la seguridad está habilitada en el servidor.

      System.out.println("El ID de usuario es " + userid);
      System.out.println("La contraseña es " + pwd);
      if ((userid.length() != 0) && (pwd.length() != 0)) {
             System.out.println("añadiendo ID de usuario y contraseña a las credenciales...");
             String[] credentials = new String[] {userid , pwd }; 
             h.put("jmx.remote.credentials", credentials);
      } else {
             System.out.println("No se han proporcionado credenciales.");
      }


      //Establecer la conexión JMX.

      JMXConnector jmxc = JMXConnectorFactory.connect(url, h);

      //Obtener la instancia de conexión del servidor de MBean.

      mbsc = jmxc.getMBeanServerConnection();

      System.out.println("Conectado a DeploymentManager");
   }


   private void getNodeAgentMBean(String nodeName)
   {
      // Consultar el nombre de objeto de MBean del agente de nodo en el nodo especificado
      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("Se ha encontrado el mbean NodeAgent "+ nodeAgent.toString());
         } else {
            System.out.println("No se ha encontrado el MBean del agente de
nodo");
            System.exit(-1);
         }
      } catch(Exception e) {
         System.out.println(e);
         System.exit(-1);
      }
   }
   
  
   private void invokeLaunchProcess(String serverName)
   {
      // Use el proceso de inicio en el MBean del agente de nodo para iniciar
      // el servidor especificado.
      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("Excepción al invocar launchProcess: " + e);
      }
   }
   
  
   private void registerNotificationListener()
   {
      // Registrar este objeto como un receptor para notificaciones del
      // MBean del agente de nodo.  No use un filtro ni utilice un objeto
      // handback.
      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)
   {
      // Cada notificación que genera el MBean del agente de nodo provocará que
      // se llame a este método.
      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()
   {
      // Ejecutar hasta que se detenga.
      try {
         while (true) {
            Thread.currentThread().sleep(60000);
            System.out.println(ntfyCount + " notification have been received");
         }
      } catch (InterruptedException e) {
      }
   }

}

Icon that indicates the type of topic Task topic



Timestamp icon Last updated: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tjmx_develop_jsr160
File name: tjmx_develop_jsr160.html