Ein JMX-Clientprogramm über die JMX-Remote-API entwickeln

Dieser Artikel beschreibt, wie Sie eine JMX-Connector-Spezifikation (Java™ Management Extensions) und eine JMX-Remote-API (JSR 160) entwickeln. Das Programm kann über Remote Method Invocation over Internet Inter-ORB Protocol (RMI-IIOP) kommunizieren.

Vorbereitende Schritte

Dieser Artikel setzt ein grundlegendes Verständnis von JSR 160, JMX-APIs und verwalteten Beans (MBeans, Managed Beans) voraus. Weitere Informationen zu JSR 160 finden Sie in der Spezifikation "JSR 160: Java Management Extensions (JMX) Remote API" auf der Website "http://www.jcp.org/en/jsr/detail?id=160". Weitere Informationen zu den JMX-APIs und zu MBeans finden Sie in der Dokumentation zu den Anwendungsprogrammierschnittstellen.

Informationen zu diesem Vorgang

Sie können Ihre Umgebung von WebSphere Application Server mit der Administrationskonsole, dem Dienstprogramm wsadmin und über JMX-Programmierung (Java Management Extensions) verwalten. Führen Sie diese Task aus, um ein fernes JMX-Clientprogramm mit der JMX Remote API zu entwickeln, sodass Sie Ihre Umgebung mit JMX-Programmierung verwalten können.

Vorgehensweise

  1. Geben Sie die Adresse des JMX-Connectors für den Server über die Klasse JMXServiceURL an.
    Der Wert der JMX-Service-URL ist
    service:jmx:rmi://" + Host + ":" + Port + "/jndi/JMXConnector"
    Wenn sales.xyz.com beispielsweise der Zielserverhost und 1234 der Empfangsport ist, lautet die JMX-Service-URL wie folgt:
    service:jmx:rmi://sales.xyz.com:1234/jndi/JMXConnector

    Sie finden den Wert für Port in der Tabelle "Ports" der Seite mit den Einstellungen des Konsolservers oder in der Datei serverindex.xml, die den Zielserver enthält. Wenn die URL keinen Wert für den Host enthält, verwendet das Produkt den Standardwert localhost. Wenn die URL keinen Wert für den Port enthält, verwendet das Produkt den Standardwert 2809.

    Wenn Sie eine Verbindung zu einem Verwaltungsagenten herstellen, fügen Sie die Portnummer des JMX-Connectors für den Verwaltungsagenten am Ende der URL hinzu. Verwenden Sie beispielsweise die folgende URL, wenn sales.xyz.com der JMX-Connector-Host und 6789 der JMX-Connector-Port des Verwaltungsagenten ist:
    service:jmx:rmi://sales.xyz.com:6789/jndi/JMXConnector6789
  2. Definieren Sie die Eigenschaft der JNDI-Provider-URL für die Verwendung des Verwaltungsnamensservice für das Produkt.

    Die Eigenschaft der JNDI-Provider-URL ist "javax.naming.Context.PROVIDER_URL". Der Verwaltungsnamensservice ist "WsnAdminNameService".

  3. Wenn der Client Sicherheit verwendet, setzen Sie die Systemeigenschaften "-Dcom.ibm.CORBA.ConfigURL" und "-Dcom.ibm.SSL.ConfigURL" in der Client-JVM.

    Wenn die Systemeigenschaften "-Dcom.ibm.CORBA.ConfigURL" und "-Dcom.ibm.SSL.ConfigURL" nicht auf gültige Systemeigenschaftendateien gesetzt werden, funktioniert der Client nicht ordnungsgemäß, wenn die Sicherheit aktiviert ist. Die empfohlene Methode für die Ausführung des JMX-Connector-Clients ist ein Thin-Verwaltungsclient.

    Gewöhnlich können Sie die Eigenschaftendateien aus einem Installationsprofilverzeichnis kopieren, vorzugsweise aus dem Profilverzeichnis des Zielservers.

  4. Geben Sie die Benutzer-ID und das Kennwort für den Server an, wenn die Sicherheit aktiviert ist.
  5. Richten Sie die JMX-Verbindung ein.
  6. Rufen Sie die Verbindungsinstanz für den MBean-Server ab.

Ergebnisse

Sie haben eine Verbindung zum Deployment Manager über eine RMI-Verbindung aufgebaut und den Anwendungsserver über die Node-Agent-MBean gestartet.

Beispiel

Verwenden Sie das folgende Thin-Client-Codebeispiel, um den JMX-Client zu erstellen und zu verwenden.

Einige Anweisungen sind zur besseren Lesbarkeit auf mehrere Zeilen verteilt.

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

         // MBean für Node Agent suchen
         client.getNodeAgentMBean(nodeName);

         // Startprozess aufrufen
         client.invokeLaunchProcess("server1");

         // Node-Agent-Ereignisse registrieren
         client.registerNotificationListener();

         // Ausführen bis Unterbrechung
         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();

      // Benutzer-ID und Kennwort für den Server angeben, wenn die Sicherheit im Server aktiviert ist

      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.");
      }


      // JMX-Verbindung herstellen.

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

      // Instanz der MBean-Serververbindung abrufen.

      mbsc = jmxc.getMBeanServerConnection();

      System.out.println("Connected to DeploymentManager");
   }


   private void getNodeAgentMBean(String nodeName)
   {
      // Objektnamen der Node-Agent-MBean auf dem angegebenen Knoten abrufen
      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)
   {
      // Startprozess in der Node-Agent-MBean zum Starten des angegebenen
      // Servers verwenden
      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("Ausnahme beim Aufrufen von launchProcess: " + e);
      }
   }
   
  
   private void registerNotificationListener()
   {
      // Dieses Objekt als Listener für Benachrichtigungen der
      // NodeAgent-MBean registrieren. Keinen Filter und kein
      // Handback-Objekt verwenden.
      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)
   {
      // Jede Benachrichtigung, die die Node-Agent-MBean generiert, bewirkt
      // einen Aufruf dieser Methode.
      ntfyCount++;
      System.out.println("***************************************************");
      System.out.println("* Benachrichtigung empfangen am " + 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()
   {
      // Ausführen bis Stopp
      try {
         while (true) {
            Thread.currentThread().sleep(60000);
            System.out.println(ntfyCount + " notification have been received");
         }
      } catch (InterruptedException e) {
      }
   }

}

Symbol, das den Typ des Artikels anzeigt. Taskartikel



Symbol für Zeitmarke Letzte Aktualisierung: 25.05.2016
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tjmx_develop_jsr160
Dateiname:tjmx_develop_jsr160.html