Ampliación del sistema administrativo de WebSphere Application Server con MBeans personalizados

Para ampliar el sistema de administración de WebSphere Application Server, debe proporcionar y registrar MBeans JMX (Java™ Management Extensions) nuevos (consulte la especificación JMX 1.x para obtener más detalles) en uno de los procesos de WebSphere.

Acerca de esta tarea

Los MBeans JMX representan la interfaz de gestión para una parte de lógica determinada. Todos los recursos gestionados en la infraestructura del producto estándar están representados como MBeans JMX. Existen varios procedimientos para crear sus propios MBeans y registrarlos con el JMX MBeanServer que se ejecute en un proceso de WebSphere cualquiera. Si desea obtener más información, consulte la documentación de la interfaz de programación de aplicaciones (API) Java de MBean. En este Information Center, pulse Reference (Referencia) > Mbean interfaces (Interfaces de Mbean).

Procedimiento

  1. Cree MBeans JMX personalizados.

    Dispone de varias alternativas que puede seleccionar para crear MBeans con el fin de ampliar el sistema administrativo del producto. Puede utilizar cualquier MBean JMX existente de otra aplicación. Puede registrar cualquier MBean que haya probado en un servidor de MBeans de JMX fuera del entorno de WebSphere Application Server en un proceso del producto, incluidos MBeans estándar, MBeans dinámicos, MBeans abiertos y MBeans de modelo.

    Además de los MBeans JMX existentes y de los que se hayan escrito y probado fuera del producto, puede utilizar las extensiones distribuidas especiales que se proporcionan con WebSphere y crear un proveedor ExtensionMBean de WebSphere. Esta alternativa proporciona una mayor integración con todas las funciones distribuidas del sistema administrativo del producto. Un proveedor ExtensionMBean implica que el usuario debe proporcionar un archivo XML que contenga un descriptor de MBean basado en la DTD facilitada con el producto. Este descriptor informa al sistema WebSphere de todos los atributos, operaciones y notificaciones a las que da soporte el MBean. Con esta información, el sistema WebSphere puede direccionar solicitudes remotas al MBean y registrar los escuchas remotos para recibir las notificaciones de suceso del MBean.

    todos los MBeans de WebSphere internos se ajustan al patrón del MBean modelo. Las clases Java puras proporcionan la lógica real para las funciones de gestión, mientras que la clase MBeanFactory de WebSphere lee la descripción de dichas funciones en el descriptor de XML MBean y crea una instancia de un ModelMBean que coincide con el descriptor. Esta instancia de ModelMBean está enlazada a las clases Java y registrada con el MBeanServer que se esté ejecutando en el mismo proceso que las clases. El código Java ahora se puede invocar desde cualquier cliente administrativo de WebSphere Application Server a través del ModelMBean creado y registrado para representarlo.

    [z/OS]Los MBeans de usuario que se ejecutan en las dos plataformas distribuidas de WebSphere Application Server y WebSphere Application Server para la plataforma z/OS pueden necesitar código especial para poder funcionar correctamente en el modelo multiproceso de z/OS. En plataformas distribuidas donde cada servidor de aplicaciones se ejecuta en una sola JVM (Máquina virtual Java), hay un único servidor MBean. El servidor de MBeans controla todos los MBeans que están registrados en ese servidor de aplicaciones. En la plataforma z/OS, hay un proceso de control y una federación de procesos sirviente, cada uno con su propio servidor de MBeans. El proceso de control tiene su propio servidor proxy de MBeans para distribuir solicitudes entre los procesos sirviente. Consulte la descripción detallada del apartado Flujo de solicitudes del modelo multiproceso de MBeans JMX.

  2. Opcionalmente, defina una política de seguridad de MBean explícita.

    Si no define ninguna política de seguridad de MBean, el producto utiliza la política de seguridad predeterminada.

  3. Registre los MBeans nuevos. Hay varias formas de registrar el MBean.

    Puede registrar el MBean con el servicio administrativo de WebSphere Application Server.

    Puede registrar el MBean con MBeanServer en un proceso de WebSphere Application Server. En la lista siguiente se describen las opciones disponibles:
    • Examine la clase MBeanFactory. Si desea la mayor integración posible con el sistema de WebSphere Application Server, utilice la clase MBeanFactory para gestionar el ciclo de vida del MBean a través de los métodos activateMBean y deactivateMBean de la clase MBeanFactory. Para utilizar estos métodos, debe proporcionar una subclase de la superclase abstracta RuntimeCollaborator y un archivo del descriptor de XML MBean. Siguiendo este procedimiento, debe proporcionar una clase Java pura que implemente la interfaz de gestión definida en el descriptor de MBean. La clase MBeanFactory crea el ModelMBean real y lo registra con el sistema administrativo del producto en su nombre.

      Esta opción se recomienda para registrar MBean de modelo.

    • Utilice las interfaces JMXManageable y CustomService. Para que el proceso de integración con al administración de WebSphere sea más fácil, implemente una interfaz CustomService que a su vez implemente la interfaz JMXManageable. Siguiendo este procedimiento, no es necesario que proporcione el RuntimeCollaborator. Cuando se inicializa la interfaz CustomService, la clase MBeanFactory de WebSphere lee el archivo del descriptor de XML MBean y crea, enlaza y registra un MBean en la interfaz CustomService automáticamente. Después de llamar al método de conclusión de CustomService, el sistema del producto desactivará automáticamente el MBean.
    • Examine la interfaz AdminService. Puede llamar al método registerMBean() en la interfaz AdminService y dicha invocación se delega al MBeanServer subyacente del proceso después de las comprobaciones de seguridad correspondientes. Puede obtener una referencia a AdminService mediante el método getAdminService() de la clase AdminServiceFactory.

      Esta opción se recomienda para registrar MBean estándar, dinámicos y abiertos. Implemente la clase UserCollaborator para utilizar los MBeans y para proporcionar a éstos un nivel coherente de soporte en plataformas distribuidas y z/OS.

      [z/OS]Para la plataforma z/OS, los MBean registrados mediante el método registerMBean() en la interfaz AdminService no son visibles desde fuera del servidor y sólo se pueden invocar desde dentro del proceso de sirviente en el que se ha registrado.

    • Obtenga instancias de MBeanServer directamente. Para obtener un referencia directa a la instancia de JMX MBeanServer que se esté ejecutando en cualquiera de los procesos del producto, llame al método getMBeanServer() de la clase MBeanFactory. Para obtener una referencia a la clase MBeanFactory, llame al método getMBeanFactory() de la interfaz AdminService.

      Cuando un MBean personalizado se registra directamente con el servidor, por omisión el nombre de objeto MBean se amplía con las claves de célula, nodo y nombre de proceso. Este registro permite que MBean participe en las características distribuidas del sistema administrativo. Puede desactivar el comportamiento predeterminado si establece la propiedad personalizada com.ibm.websphere.mbeans.disableRouting.

      Consulte Propiedades personalizadas de los servicios de administración para obtener más información sobre cómo establecer y utilizar la propiedad personalizada com.ibm.websphere.mbeans.disableRouting.

Resultados

Independientemente del procedimiento que utilice para crear y registrar el MBean, debe configurar correctamente los Permisos de seguridad Java 2 para el nuevo código de MBean. AdminService y MBeanServer de WebSphere están altamente protegidos mediante los permisos de seguridad de Java 2 y, si no otorga los permisos de la base de código explícitamente, se generan excepciones de seguridad cuando intente invocar métodos de estas clases. Si proporciona el MBean como parte de la aplicación, puede establecer los permisos en el archivo was.policy que facilite como parte de los metadatos de la aplicación. Si utiliza una interfaz CustomService u otro código que no se facilite como aplicación, puede editar el archivo library.policy en la configuración del nodo o incluso el archivo server.policy del directorio properties para una instalación específica.

[z/OS]

Ejemplo: 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="Sample State MBean for the documentation example.">

  <attribute description="The name of the 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="Initialize the State MBean."
    impact="ACTION" name="initializeState" role="operation"
    targetObjectType="objectReference" type="void" proxyInvokeType="multicall">
    <signature>
      <parameter description="El nombre del MBean."
        name="mbeanName" type="java.lang.String"/>
      <parameter description="El estado inicial del 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>

Implementación de SampleState

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 preparado para e-business";
        */
        
        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;
    }
}

Implementación de SampleStateAggregationHandler

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() + "!";
    }
    
}

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