Estendendo o Sistema Administrativo do WebSphere Application Server com MBeans Customizados

É possível estender o sistema de administração do WebSphere Application Server fornecendo e registrando novos MBeans Java™ Management Extensions (JMX) (consulte a Especificação JMX 1.x para obter detalhes) em um dos processos do WebSphere.

Sobre Esta Tarefa

Os MBeans JMX representam a interface de gerenciamento de uma determinada parte da lógica. Todos os recursos gerenciados na infraestrutura padrão do produto são representados como MBeans JMX. Existem várias maneiras de criar seus próprios MBeans e registrá-los no JMX MBeanServer em execução em qualquer processo do WebSphere. Para obter informações adicionais, consulte a documentação da application programming interface (API) Java de MBean. Neste centro de informações, clique em Referência > Interfaces de Mbean.

Procedimento

  1. Crie MBeans JMX personalizados.

    Você tem algumas alternativas para seleção, ao criar MBeans para estender o sistema administrativo do produto. É possível utilizar qualquer MBean JMX existente de outro aplicativo. É possível registrar qualquer MBean testado em um servidor MBean JMX fora do ambiente do WebSphere Application Server em um processo do produto, incluindo MBeans padrão, MBeans dinâmicos, MBeans abertos e MBeans de modelo.

    Além de MBeans JMX existentes e dos que foram gravados e testados fora do ambiente do produto, você pode usar as extensões distribuídas especiais fornecidas pelo WebSphere e criar um provedor de ExtensionMBean do WebSphere. Esta alternativa fornece melhor integração com todas as funções distribuídas do sistema administrativo do produto. Um provedor de ExtensionMBean implica que você fornece um arquivo XML que contém o Descritor de MBean baseado na DTD fornecida com o produto. Esse descritor indica ao sistema WebSphere todos os atributos, operações e notificações suportados pelo MBean. Com estas informações, o sistema WebSphere pode rotear pedidos remotos para seu MBean e registrar Listeners remotos para receber suas notificações de eventos de MBean.

    Todos os MBeans internos do WebSphere seguem o padrão MBean de Modelo. As classes Java puras fornecem a lógica real para funções de gerenciamento e a classe MBeanFactory do WebSphere lê a descrição dessas funções do Descritor de MBean XML e cria uma instância de um ModelMBean que corresponde ao descritor. Essa instância de ModelMBean é ligada a suas classes Java e registrada no MBeanServer em execução no mesmo processo que suas classes. Seu código Java agora pode ser chamado a partir de qualquer cliente administrativo do WebSphere Application Server por meio do ModelMBean criado e registrado para representá-lo.

    [z/OS]Os MBeans do usuário executados nas plataformas distribuídas do WebSphere Application Server e na plataforma do WebSphere Application Server para z/OS podem requerer codificação especial para funcionarem corretamente no modelo de multiprocessos do z/OS. Em plataformas distribuídas nas quais cada servidor de aplicativos é executado em uma única Java virtual machine (JVM), existe apenas um servidor MBean. O servidor MBean controla todos os MBeans registrados no servidor de aplicativos. Na plataforma z/OS, há um processo de controle e uma federação de processos do servidor, cada um com seu próprio servidor MBean. O processo de controle possui seu próprio servidor proxy MBean para distribuir pedidos entre os processos servant. Consulte a discussão detalhada do fluxo de pedido do modelo de multiprocessos do MBean de JMX.

  2. Opcionalmente, defina uma política de segurança de MBean explícita.

    Se você não definir uma política de segurança de MBean, o produto usará a política de segurança padrão.

  3. Registre os novos MBeans. Há várias maneiras de registrar seu MBean.

    Você pode registrar seu MBean com o serviço administrativo do WebSphere Application Server.

    Você pode registrar seu MBean com o MBeanServer em um processo do WebSphere Application Server. A lista a seguir descreve as opções disponíveis em ordem de preferência:
    • Passe pela classe MBeanFactory. Se desejar a maior integração possível com o sistema WebSphere Application Server, use a classe MBeanFactory para gerenciar o ciclo de vida de seu MBean por meio dos métodos activateMBean e deactivateMBean da classe MBeanFactory. Utilize esses métodos fornecendo uma subclasse da superclasse abstrata RuntimeCollaborator e um arquivo descritor de MBean XML. Utilizando essa abordagem, você fornece uma classe Java pura que implementa a interface de gerenciamento definida no descritor de MBean. A classe MBeanFactory cria o ModelMBean real e registra-o com o sistema administrativo do produto para você.

      Esta opção é recomendada para registrar MBeans de modelo.

    • Utilize o JMXManageable e a interface CustomService. Você pode tornar o processo de integração com a administração do WebSphere ainda mais fácil implementando uma interface CustomService que também implementa a interface JMXManageable. Utilizando essa abordagem, você pode evitar o fornecimento do RuntimeCollaborator. Quando a interface CustomService é inicializada, a classe MBeanFactory do WebSphere lê seu arquivo de descritor de MBean XML e cria, liga e registra um MBean para a interface CustomService automaticamente. Após a chamada do método de encerramento do CustomService, o sistema do produto desativa automaticamente seu MBean.
    • Passe pela interface AdminService. Você pode chamar o método registerMBean() na interface AdminService e a chamada será delegada ao MBeanServer subjacente ao processo depois de verificações apropriadas da segurança. É possível obter uma referência ao AdminService utilizando o método getAdminService() da classe AdminServiceFactory.

      Esta opção é recomendada para registrar MBeans padrão, dinâmico e aberto. Implemente a classe UserCollaborator para utilizar os MBeans e para fornecer um nível consistente de suporte para eles nas plataformas distribuída e z/OS.

      [z/OS]Para a plataforma z/OS, um MBean registrado por meio do método registerMBean() na interface AdminService não é visível fora do servidor e só pode ser chamado a partir do processo servant no qual ele foi registrado.

    • Obtenha instâncias do MBeanServer diretamente. Você pode obter uma referência direta à instância de MBeanServer JMX em execução em qualquer processo do produto, chamando o método getMBeanServer() da classe MBeanFactory. Você obtém uma referência à classe MBeanFactory chamando o método getMBeanFactory() da interface AdminService.

      Quando um MBean customizado é registrado diretamente no servidor MBean, o nome do objeto MBean é, por padrão, aprimorado com as chaves de nome de célula, nó e processo. Este registro permite que o MBean participe dos recursos distribuídos do sistema administrativo. É possível desativar o comportamento padrão configurando a propriedade customizada com.ibm.websphere.mbeans.disableRouting.

      Consulte Propriedades customizadas dos serviços de administração para obter mais informações sobre como configurar e usar a propriedade customizada com.ibm.websphere.mbeans.disableRouting.

Resultados

Independentemente da abordagem utilizada para criar e registrar seu MBean, é necessário configurar 2 permissões de segurança Java apropriadas para seu novo código de MBean. O AdminService e o MBeanServer do WebSphere são totalmente protegidos utilizando as permissões de segurança Java 2 e se você não conceder explicitamente suas permissões de código base, exceções de segurança serão emitidas ao tentar chamar métodos dessas classes. Se você estiver fornecendo o MBean como parte do aplicativo, é possível definir as permissões no arquivo was.policy fornecido como parte dos metadados do aplicativo. Se estiver utilizando uma interface CustomService ou outro código que não seja fornecido como um aplicativo, é possível editar o arquivo library.policy na configuração do nó ou até mesmo o arquivo server.policy no diretório properties de uma instalação específica.

[z/OS]

Exemplo: O 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="The name of the MBean."
        name="mbeanName" type="java.lang.String"/>
      <parameter description="The initial state of the 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="Este MBean de estado de amostra está no estado parando.">
      <notificationType>j2ee.state.stopping</notificationType>
  </notification>
  <notification name="j2ee.state.stopped" severity="6" log="false"
                description="Este MBean de estado de amostra está no estado parado.">
      <notificationType>j2ee.state.stopped</notificationType>
  </notification>    
</MBean>

Implementação 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);
    
    // Constantes STATE protegidas por pacote.
    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";
    
    // O Estado Dynamicproxy está inicializado com o estado STOPPED.
    private String state = STATE_STOPPED;
    
    public SampleState() {
        if (tc.isEntryEnabled()) Tr.entry(tc,"<init>");
        
        // O estado é inicializado durante a inicialização de "estado",
        // mas também pode ser inicializado aqui no construtor.
        /*
        state = "WebSphere Application Server para z/OS pronto 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;
    }
}

Implementação 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);
    
    /**
     * Retornar um resultado agregado de uma operação Mbean de várias chamadas que
     * compila através de todos os resultados de MBeans do servant e retorna um
     * único valor de retorno respectivo para um método chamado.
     *
     * @param  methodName           Nome do método MBean
     * @param  params               Parâmetros do método MBean
     * @param  signatures           Assinaturas do método MBean
     * @param  servantMBeanResults  Resultado de cada instância de MBean do servant
     *                              chamada pela chamada multicast 
     *                              dynamicproxy.
     *                              Nota: esse valor pode ser "null" OU uma
     *                              matriz de "nulls" no caso do valor de retorno do
     *                              método ser "void." Implementação
     *                              deste método DEVE tratar esse caso para
     *                              evitar um <code>NullPointerException</code>.
     * @param stateObject
     *        O provedor MBean forneceu <code>StateObject</code> utilizado pelo 
     *        MBean dynamicproxy no CR para gerenciar seu estado. Nota: esse objeto
     *        PODERÁ SER nulo se "stateObjectClass" não foi especificado OU se ocorreu
     *        um erro interno durante a inicialização do MBean dynamicproxy.
     *        A implementação DEVE tratar adequadamente a entrada "null".
     *                
     * Resultado agregado @return conforme definido pelo xml do MBean para a operação
     *         de MBean especificada.
     */
    public Object aggregateResults(String methodName,
                                   Object[] params,
                                   String[] signatures,
                                   Object[] servantMBeanResults,
                                   StateObject stateObject) {
                                       
        if (tc.isEntryEnabled()) Tr.entry(tc,"aggregateResults",methodName);
        
        // Como você pode ver a partir do MBeanDescriptor do SampleStateMBean,
        // ele declara os quatro métodos a seguir:
        // 1. String getMBeanName()         [proxyInvokeType == unicall]
        // 2. String getState()             [proxyInvokeType == multicall]
        // 3. void setState(String)         [proxyInvokeType == multicall]
        // 4. void initializeState()        [proxyInvokeType == multicall]
        //
        // A partir deste métodos, o único que requer agregação
        // é o método #2 getState que é uma operação MBean de várias chamadas E
        // que retorna um valor que pode ser agregado.
        //
        // Neste exemplo, nós simplesmente obtemos o resultado de pedidos do MBean getState
        // de cada servant e os concatenamos em uma Cadeia longa que
        // exibe o estado de cada servant. 
        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();
        }
        // Se também tivermos um método de exemplo que retorna um int, 
        // getNumberOfMBeans(), ele poderá obter a abordagem similar
        // e adicionar o resultado getNumberOfMBeans() da cada servant aqui.
        /* Exemplo adicionado para método não existente: 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() + "!";
    }
    
}

Ícone que indica o tipo de tópico Tópico de Tarefa



Ícone de registro de data e hora Última atualização: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tjmx_extend
Nome do arquivo: tjmx_extend.html