Verwaltungssystem von WebSphere Application Server mit angepassten MBeans erweitern

Sie können das Verwaltungssystem von WebSphere Application Server erweitern, indem Sie in einem der WebSphere-Prozesse neue JMX-MBeans (Java™ Management Extensions) bereitstellen und registrieren. (Ausführliche Informationen können Sie der Spezifikation JMX 1.x entnehmen.)

Informationen zu diesem Vorgang

JMX-MBeans repräsentieren die Administrationsschnittstelle für eine bestimmtes Logiksegment. Alle verwalteten Ressourcen in der Standardinfrastruktur des Produkts werden von JMX-MBeans repräsentiert. Es gibt eine Vielzahl von Möglichkeiten, eigene MBeans zu erstellen und bei dem in einem WebSphere-Prozess ausgeführten JMX MBeanServer zu registrieren. Weitere Informationen finden Sie in Dokumentation zu MBean-APIs (Java Application Programming). Klicken Sie in diesem Information Center auf Referenz > MBean-Schnittstellen.

Vorgehensweise

  1. Erstellen Sie eigene JMX-MBeans.

    Für das Erstellen von MBeans zur Erweiterung des Produktverwaltungssystems gibt es verschiedene Möglichkeiten. Sie können eine vorhandene JMX-MBean von einer anderen Anwendung verwenden. Sie können jede MBean, die Sie in einem JMX-MBean-Server außerhalb der Umgebung von WebSphere Application Server getestet haben, in einem Produktprozess registrieren. Dazu gehören Standard-MBeans, dynamische MBeans, offene MBeans und Modell-MBeans.

    Neben den vorhandenen und den außerhalb der Produktumgebung geschriebenen und getesteten MBeans können Sie die von WebSphere bereitgestellten speziellen verteilten Erweiterungen nutzen und einen WebSphere-ExtensionMBean-Provider erstellen. Diese Alternative ermöglicht eine bessere Integration in alle verteilten Funktionen des Produktverwaltungssystems. Ein ExtensionMBean-Provider setzt voraus, dass Sie eine XML-Datei mit einem auf der im Lieferumfang des Produkts enthaltenen DTD basierenden MBean-Deskriptor bereitstellen. Dieser Deskriptor teilt dem WebSphere-System mit, welche Attribute, Operationen und Benachrichtigungen von Ihrer MBean unterstützt werden. Ausgehend von diesen Informationen kann das WebSphere-System ferne Anforderungen an Ihre MBean weiterleiten und ferne Listener für den Empfang Ihrer MBean-Ereignisbenachrichtigungen registrieren.

    Alle internen WebSphere-MBeans folgen dem Model-MBean-Muster. Reine Java-Klassen stellen die reale Logik für Verwaltungsfunktionen bereit. Die WebSphere-Klasse "MBeanFactory" liest die Beschreibung dieser Funktionen aus dem XML-MBean-Deskriptor und erstellt eine dem Deskriptor entsprechende ModelMBean-Instanz. Diese ModelMBean-Instanz wird an Ihre Java-Klassen gebunden und von dem MBeanServer registriert, der in demselben Prozess wie Ihre Klassen ausgeführt wird. Jetzt kann Ihr Java-Code von jedem Verwaltungsclient von WebSphere Application Server über die ModelMBean aufgerufen werden, die für ihn erstellt und registriert wurde.

    [z/OS]Benutzer-MBeans, die auf den verteilten Plattformen von WebSphere Application Server und auf der Plattform von WebSphere Application Server for z/OS ausgeführt werden, funktionieren im z/OS-Multiprozessmodell möglicherweise erst nach einer speziellen Codierung. Auf verteilten Plattformen, bei denen jeder Anwendungsserver in einer eigenen Java Virtual Machine (JVM) ausgeführt wird, gibt es nur einen MBean-Server. Der MBean-Server steuert alle MBeans, die unter diesem Anwendungsserver registriert sind. Auf der Plattform z/OS gibt es einen Steuerprozess und ein Verbund von Servant-Prozessen mit jeweils einem eigenen MBean-Server. Der Steuerprozess nutzt seinen eigenen MBean-Proxy-Server, um Anfragen auf die Servant-Prozesse zu verteilen. Lesen Sie hierzu die ausführlichen Informationen im Artikel "Fluss der Anforderungen im JMX-MBean-Multiprozessmodell".

  2. Definieren Sie optional eine explizite Sicherheitsrichtlinie für MBeans.

    Wenn Sie keine Sicherheitsrichtlinie für MBeans definieren, verwendet das Produkt die Standardsicherheitsrichtlinie.

  3. Registrieren Sie die neuen MBeans. Eine MBean kann auf verschiedene Arten registriert werden.

    Sie können Ihre MBean mit dem Verwaltungsservice von WebSphere Application Server registrieren.

    Sie können Ihre MBean mit dem MBeanServer bei einem Prozess von WebSphere Application Server registrieren. Die folgende Liste beschreibt die verfügbaren Optionen in der Reihenfolge ihrer Priorität:
    • Verwenden Sie die Klasse MBeanFactory. Wenn Sie eine größtmögliche Integration in das System von WebSphere Application Server anstreben, verwenden Sie die Methoden activateMBean und deactivateMBean der Klasse MBeanFactory, um den Lebenszyklus Ihrer MBean zu verwalten. Geben Sie bei Verwendung dieser Methoden eine Unterklasse der abstrakten Superklasse RuntimeCollaborator und eine XML-MBean-Deskriptordatei an. Mit diesem Ansatz stellen Sie eine reine Java-Klasse bereit, die die im MBean-Deskriptor definierte Administrationsschnittstelle implementiert. Die Klasse MBeanFactory erstellt die eigentliche ModelMBean und registriert sie für Sie beim Verwaltungssystem des Produkts.

      Diese Option wird für die Registrierung von Modell-MBeans empfohlen.

    • Verwenden Sie die Schnittstelle "JMXManageable" und eine CustomService-Schnittstelle. Sie können die Integration in die WebSphere-Administration noch einfacher gestalten, indem Sie eine CustomService-Schnittstelle implementieren, die wiederum die Schnittstelle "JMXManageable" implementiert. Bei diesem Ansatz müssen Sie nicht die Klasse RuntimeCollaborator bereitstellen. Wenn Ihre CustomService-Schnittstelle initialisiert wird, liest die WebSphere-Klasse "MBeanFactory" Ihre XML-MBean-Deskriptordatei und erstellt automatisch eine MBean, die dann ebenfalls automatisch an Ihre CustomService-Schnittstelle gebunden und für diese registriert wird. Nach dem Aufrufen der Methode shutdown Ihrer CustomService-Schnittstelle wird Ihre MBean automatisch vom Produktsystem inaktiviert.
    • Verwenden Sie die Schnittstelle AdminService. Sie können für die Schnittstelle AdminService die Methode registerMBean() aufrufen. Nach den erforderlichen Sicherheitsprüfungen wird dieser Aufruf dann an den dem Prozess zugrunde liegenden MBeanServer delegiert. Eine Referenz auf AdminService können Sie mit der Methode getAdminService() der Klasse AdminServiceFactory abrufen.

      Diese Option wird für die Registrierung von Standard-MBeans, dynamischen MBeans und offenen MBeans empfohlen. Implementieren Sie die Klasse "UserCollaborator", um MBeans zu verwenden und eine konsistente Unterstützung der MBeans auf verteilten und z/OS-Plattformen zu erreichen.

      [z/OS]Auf der Plattform z/OS ist eine MBean, die mit der Methode registerMBean() der Schnittstelle AdminService registriert wird, außerhalb des Servers nicht sichtbar und kann nur innerhalb des Servantprozesses aufgerufen werden, in dem sie registriert wurde.

    • Rufen Sie direkt MBeanServer-Instanzen ab. Sie können eine direkte Referenz auf die in einem Produktprozess aktive JMX-MBeanServer-Instanz anfordern. Rufen Sie dazu die Methode getMBeanServer() der Klasse MBeanFactory auf. Eine Referenz auf die Klasse MBeanFactory erhalten Sie, wenn Sie die Methode getMBeanFactory() der Schnittstelle AdminService aufrufen.

      Wenn eine angepasste MBean direkt beim MBean-Server registriert ist, wird der Objektname der MBean standardmäßig mit dem Zellen-, Knoten- und Prozessnamen ergänzt. Mit dieser Registrierung ist die MBean in der Lage, die verteilten Funktionen des Verwaltungssystems zu nutzen. Sie können das Standardverhalten mit der angepassten Eigenschaft "com.ibm.websphere.mbeans.disableRouting" inaktivieren.

      Weitere Informationen darüber, wie Sie die angepasste Eigenschaft "com.ibm.websphere.mbeans.disableRouting" definieren und verwenden, finden Sie unter Angepasste Eigenschaften für Verwaltungsservices

Ergebnisse

Regardless of the approach used to create and register your MBean, you must set up proper Java 2 security permissions for your new MBean code. Die WebSphere-Schnittstelle "AdminService" und der MBeanServer werden durch Java-2-Sicherheitsberechtigungen streng geschützt. Sollten Sie Ihrem Code nicht explizit Basisberechtigungen einräumen, werden Sicherheitsausnahmen ausgelöst, wenn Sie versuchen, die Methoden dieser Klassen aufzurufen. Wenn Sie Ihre MBean im Rahmen Ihrer Anwendung zur Verfügung stellen, können Sie die Berechtigungen in der Datei was.policy festlegen, die Sie mit den Metadaten Ihrer Anwendung bereitstellen. Falls Sie eine CustomService-Schnittstelle oder einen anderen, nicht als Anwendung zur Verfügung gestellten Code verwenden, können Sie die Datei library.policy in der Knotenkonfiguration editieren oder auch die Datei server.policy im Verzeichnis properties für eine bestimmte Installation.

[z/OS]

Beispiel: Die MBean SampleStateMBean

MBeanDescriptor

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE MBean SYSTEM "MbeanDescriptor.dtd">
<MBean type="SampleStateMBean"
  aggregationHandlerClass="com.ibm.ws390.sample.SampleStateAggregationHandler"
  eventHandlerClass="com.ibm.ws390.sample.SampleStateEventHandler"
  invocationHandlerClass="com.ibm.ws390.sample.SampleStateInvocationHandler"
  stateObjectClass="com.ibm.ws390.sample.SampleState"
  version="6.0"
  platform="dynamicproxy"
  description="Status-MBean als Beispiel für die Dokumentation">

  <attribute description="Name der MBean"
    getMethod="getMBeanName" name="mbeanName" type="java.lang.String"
    proxyInvokeType="unicall"/>
  <attribute description="The state of the MBean."name="state"
    getMethod="getState" setMethod="setState" type="java.lang.String"
    proxyInvokeType="multicall" proxySetterInvokeType="multicall"/>
  <operation
    description="Initialisieren der Status-MBean"
    impact="ACTION" name="initializeState" role="operation"
    targetObjectType="objectReference" type="void" proxyInvokeType="multicall">
    <signature>
      <parameter description="Name der MBean"
        name="mbeanName" type="java.lang.String"/>
      <parameter description="Anfangsstatus der MBean"
        name="mbeanName" type="java.lang.String"/>
    </signature>
  </operation>
  
  <notification name="j2ee.state.starting" severity="6" log="false"
                description="This sample state MBean is in starting state.">
      <notificationType>j2ee.state.starting</notificationType>
  </notification>    
  <notification name="j2ee.state.running" severity="6" log="false"
                description="This sample state MBean is in running state.">
      <notificationType>j2ee.state.running</notificationType>
  </notification>    
  <notification name="j2ee.state.stopping" severity="6" log="false"
                description="This sample state MBean is in stopping state.">
      <notificationType>j2ee.state.stopping</notificationType>
  </notification>    
  <notification name="j2ee.state.stopped" severity="6" log="false"
                description="This sample state MBean is in stopped state.">
      <notificationType>j2ee.state.stopped</notificationType>
  </notification>    
</MBean>

SampleState-Implementierung

package com.ibm.ws390.sample;

import com.ibm.ejs.ras.Tr;
import com.ibm.ejs.ras.TraceComponent;
import java.io.Serializable; 
import com.ibm.websphere.management.dynamicproxy.StateObject;

public class SampleState extends StateObject {
    
    private static TraceComponent tc =
    Tr.register(SampleState.class,"SampleState",null);
    
    // Package protected STATE constants.
    static final String STATE_STARTING = "j2ee.state.starting";
    static final String STATE_RUNNING  = "j2ee.state.running";
    static final String STATE_STOPPING = "j2ee.state.stopping";
    static final String STATE_STOPPED  = "j2ee.state.stopped";
    
    // Dynamicproxy State is initialized with STOPPED state.
    private String state = STATE_STOPPED;
    
    public SampleState() {
        if (tc.isEntryEnabled()) Tr.entry(tc,"<init>");
        
        // State is initialized during "state" initialization,
        // but can also be initialized here in the constructor as well.
        /*
        state = "WebSphere Application Server for z/OS für E-Business bereit";
        */
        
        if (tc.isEntryEnabled()) Tr.exit(tc,"<init>");
    }
    
    public synchronized String getState() {
        if (tc.isEntryEnabled()) Tr.entry(tc,"getState");
        if (tc.isEntryEnabled()) Tr.exit(tc,"getState",state);
        return state;
    }
    
    public synchronized void setState(String state) {
        if (tc.isEntryEnabled()) Tr.entry(tc,"setState",state);
        this.state	= state;
        if (tc.isEntryEnabled()) Tr.exit(tc,"setState");
    }
    
    public synchronized String getStateObjectInfo() {
        return state;
    }
}

SampleStateAggregationHandler implementation

package com.ibm.ws390.sample;

import com.ibm.websphere.management.dynamicproxy.AggregationHandler;
import com.ibm.websphere.management.dynamicproxy.StateObject;

import com.ibm.ejs.ras.Tr;
import com.ibm.ejs.ras.TraceComponent;

public class SampleStateAggregationHandler implements AggregationHandler {
    
    private static TraceComponent tc =
    Tr.register(SampleStateAggregationHandler.class,"SampleState",null);
    
    /**
     * Return an aggregated result from a multicall Mbean operation which
     * compiles through all servant MBeans' results and returns a respective
     * single return value for an invoked method.
     *
     * @param  methodName           MBean method name
     * @param  params               MBean method parameters
     * @param  signatures           MBean method signatures
     * @param  servantMBeanResults  Result of each servant MBean instances
     *                              invoked by the dynamicproxy multicast 
     *                              invocation.
     *                              Note: this value can be "null" OR can be
     *                              an array of "null"s in case return value
     *                              of the method is "void." Implementation
     *                              of this method MUST handle this case to
     *                              avoid a <code>NullPointerException</code>.
     * @param stateObject
     *        MBean provider provided <code>StateObject</code> used by 
     *        dynamicproxy MBean in CR to manage its state. Note: this object
     *        MAY BE null if "stateObjectClass" was not specified OR internal
     *        error occurred during initialization of this dynamicproxy MBean.
     *        Implmentation MUST properly handle "null" input.
     *                
     * @return aggregated result as defined by MBean xml for specified
     *         MBean operation.
     */
    public Object aggregateResults(String methodName,
                                   Object[] params,
                                   String[] signatures,
                                   Object[] servantMBeanResults,
                                   StateObject stateObject) {
                                       
        if (tc.isEntryEnabled()) Tr.entry(tc,"aggregateResults",methodName);
        
        // As you can see from the MBeanDescriptor of SampleStateMBean,
        // it declares the following four methods:
        // 1. String getMBeanName()         [proxyInvokeType == unicall]
        // 2. String getState()             [proxyInvokeType == multicall]
        // 3. void setState(String)         [proxyInvokeType == multicall]
        // 4. void initializeState()        [proxyInvokeType == multicall]
        //
        // From these methods, the only one that requires aggregation
        // is #2 getState method which is a multicall MBean operation AND
        // it returns a value that can be aggregated.
        //
        // In this example, we simply take each servants' getState MBean
        // request result and concatenate them into one long String that
        // displays each servants' state. 
        if (methodName.equals("getState")) {
            StringBuffer stateBuf = new StringBuffer();
            
            for (int i=0; i<servantMBeanResults.length; i++) {
                stateBuf.append("SERVANT #" + i + " state ==|" + 
                                servantMBeanResults[i] + "|== ");
            }
            return stateBuf.toString();
        }
        // If we also had an example method which returns say an int, 
        // getNumberOfMBeans(), it can take the similar approach
        // and to add each servants' getNumberOfMBeans() result together here.
        /* example added for non-existent method: int getNumberOfMBeans()
        else if (methodName.equals("getNumberOfMBeans")) {
            int aggregatedResult = 0;
            
            for (int i=0; i<servantMBeanResults.length; i++) {
                aggregatedResult += (int) servantMBeanResults[i];
            }
            return aggregatedResult;
        }
        */
        
        return methodName + " is NOT handled by " + getClass().getName() + "!";
    }
    
}

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_extend
Dateiname:tjmx_extend.html