MBeans y JBoss

1
20736

MBeans y JBoss


Los ejemplos de este tutorial están hechos con el siguiente entorno de desarrollo:
  • Jboss Eclipse IDE Milestone 5.
  • JDK 1.5


  • JBoss 4.0.5 GA




>
INTRODUCCION




.




Unade las características que está haciendo al servidor deaplicaciones JBoss extenderse como una plaga, es la modularidad. Esta modularidad en JBoss está construida sobre el API JMX (Java Management Extension).





JMX es un estándar para gestionar y monitorizar gran variedad de componentes, tanto hardware como software desde Java.




JMX define una arquitectura en 3 niveles o capas:








  • Capa de Instrumentación
    .Incluye todos los recursos gestionables. Este nivel define losrequerimientos para implementar un recurso gestionable mediante JMX. Unrecurso gestionable por JMX puede ser cualquier cosa (aplicaciones,dispositivos, etc…). El componente software que provee lainstrumentación de un determinado recurso es un MBean (ManagedBean). Un MBean es un objeto java que implementa uno de los interfacesestándar de MBean y sigue los patrones de diseñoasociados al mismo. Un MBean expondrá todos los métodos ypropiedades que considere necesarios para un determinado recurso. Porejemplo, si nuestro MBean expone una impresora, tendrá metodoscomo imprimir, pausar etc… y propiedades como tamaño delpapel, estado de la impresora etc…. JMX presenta cuatro tipos de MBeans:

    • MBeans estándar

      (Standar MBeans)
      . Es un java bean simple y definido estáticamente. (son los más comunes dentro de JBoss)

    • MBeans dinámicos

      (Dynamic MBeans)
      . Estos exponen su interfaz en tiempo de ejecución.

    • MBeans Abiertos
      .
      (Open MBeans)
      Son una extensión de los anteriores.

    • MBeans de modelo

      (Model MBeans)
      .Son también una extensión de los MBeans dinámicos.Simplifican la instrumentación de los recursos proporcionando uncomportamiento por defecto. Los XMBeans de JBoss son una implementación de este tipo.

  • Capa de Agente.
    Estenivel provee los requerimientos para implementar un agente. Los agentesson los responsables de controlar y hacer disponibles los recursosmanejados en el nivel de instrumentación, así como gestionar las relaciones entre ellos.



  • Capa de Servicios distribuidos
    .Mecanismo mediante el cual las aplicaciones de administración interactúan con los agentes y sus objetos gestionados.
Uncomponente esencial en el nivel o capa de agente, es el servidor deMBeans. Un MBean Server es un registro de MBeans que los haceaccesibles a otras aplicaciones. Un MBean Server no expone directamenteel interfaz de los MBeans a las aplicaciones, sino que existe unúnico interfaz provisto por el MBean Server con el que poderinvocar al interfaz de los MBeans (así se consigue desacoplar los MBeans de las aplicaciones que los manejan).



>
Echando un vistazo a los MBeans de JBoss.




JBoss incluye varios adaptadores que permiten el acceso al servidor JMX de MBeans:

  • Un adaptador HTML.
  • Un adaptador RMI
  • Un EJB.

También incluye unaademás una aplicación WEB que hace uso del adaptador HTML para acceder al Servidor JMX de MBeans (la jmx-console) y 

una herramienta desde la línea de comandos (twiddle)

Echemos un vistazo primero a la consola:

http://localhost:8080/jmx-console/

Consola jmx


 



Desde la consola podemos ver los MBeans que se encuentranregistrados en el servidor, buscarlos o filtrarlos por su nombre, ver ymodificar sus atributos, invocar a las operaciones de los mismos, etc… .

Veamos por ejemplo el MBean:
jboss:service=JNDIView 
y  pulsemos sobre  el:

MBean JNDIView

Una vez seleccionado, pulsad sobre el método list:

JNDIView

Se nos muestra el estado actual de JNDI.

Vamos a hacer lo mismo pero ahora usando el adaptador RMI.

Abrimos el eclipse y nos creamos un nuevo proyecto. Importar todas las librerías que se encuentran en: <JBOSS_PATH>/client

Crearemos una clase que llamaremos JNDIBrowser:



package com.autentia.tutoriales.jboss.mbeans;









import java.util.Hashtable;





import javax.management.ObjectName;





import javax.naming.InitialContext;





import org.jboss.jmx.adaptor.rmi.RMIAdaptor;









public class JNDIBrowser {





   





    public static void main(String[] args) throws Exception {





       





       
// Creamos las propiedades para el acceso a JNDI.    
   





        Hashtable props = new Hashtable();




 props.put("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory");

         props.put("java.naming.factory.url.pkgs","org.jboss.naming:org.jnp.interfaces");




 props.put("java.naming.provider.url","jnp://localhost:1099");




       





       
// Creamos el contexto JNDI






       InitialContext context = new InitialContext(props);





       





       
/*     Buscamos el Adaptador JNDI que está enlazado en:






         "jmx/invoker/RMIAdaptor" */       





 
RMIAdaptor rmiserver =  (RMIAdaptor)context.lookup("jmx/invoker/RMIAdaptor");






       





       
/* Le pedimos al servidor de MBeans RMI el Bean llamado:






            jboss:service=JNDIView  */





       
ObjectName beanName = new ObjectName("jboss:service=JNDIView");






       





       
// Invocamos el metodo list del MBean.






       
String[] tiposParametros = {"boolean"};






        Object[] valoresParametros = {Boolean.TRUE};



















ObjectresultadoLista = rmiserver.invoke(beanName,"list",valoresParametros,tiposParametros);





       





       
// Invocamos al metodo listXML






       
Object resultadoXML = rmiserver.invoke(beanName,"listXML", null, null);






       





       
// Lo pintamos todo.






        System.out.println("-- INVOCANDO AL MBEAN jboss:service=JNDIView --");





        System.out.println("********  VISTA FORMATO LISTA **************");





        System.out.println(resultadoLista);





        System.out.println("*******************************************");





        System.out.println("********  VISTA FORMATO XML **************");





        System.out.println(resultadoXML);





      System.out.println("*******************************************");       





    }





}






Fijaos principalmente enla forma de invocar a los métodos del MBean. Como comentéanteriormente, el servidor de MBeans no expone los métodos de los Beansdirectamente sino a través de un interfaz genérico, con el objetivo de no acoplar las herramientas con los MBeans.









El resultado:

Resultado invocar por RMI

JBoss nos da la posibilidad de crear nuestros propios adaptadores para acceso al servidor de MBeans por medio de otros protocolos.

>
Creando nuestros propios MBeans




>







JBoss durante el arranque, una de las primeras tareas que realiza escrear una instancia del Servidor de MBeans. En la arquitectura de JBoss, este servidor juega un papel similar al del
microkernel
de un sistema operativo. Es decir, el corazón de JBoss contienesolamente lo esencial del servidor de aplicaciones, toda lafuncionalidad restante es registrada por medio de MBeans dentro del servidor.

Por lo tanto, añadirle nueva funcionalidad a JBoss consiste enregistrar nuevos MBeans. Dentro de JBoss podemos registrar MBeansindependientes del resto de servicios de JBoss. Estos pueden crearsesiguiendo la especificación JMX y registrándolos en el fichero
<JBOSS_PATH>/server/default/deploy/user-service.xml

Sin embargo, cuando creamos MBeans que dependen de otros servicios,debemos serguir el patrón de servicios de JBoss. Estepatrón consiste en un conjunto de operaciones del ciclo de vida de los MBeans dentro del servidor que proporcionan
notificaciones
sobre cambios de estado. Los MBeans que siguen este patrón se denominan
MBeans de servicio
. Las notificaciones informan a un MBean cuando puede
crearse, destruirse, iniciarse o pararse
. Los MBeans que gestionan el ciclo de vida de un MBean de servicio son tres:
SARDeployer
,
ServiceConfigurator
y
ServiceController
.

  • SARDeployer (
    S
    ervice
    AR
    chivedeployer) es el encargado del despliegue de MBeans de servicio. Es el encargado de manejar los ficheros de servicios. Estos pueden ser tanto un
    «.sar» 
    (unjar con esa extensión que contiene un fichero descriptor delservicio: META-INF/jboss-service.xml) o un fichero xml que define un servicio cuyo nombre ha de seguir el patron
    *-service.xml

  • ServiceController.Se encarga de manejar las dependencias entre todos los MBeans.SARDeployer delega la inicialización, creación,destrucción, inicio y parada de los servicios al ServiceController.
  • ServiceConfigurator. Se encarga de configurar y registrar los servicios en el servidor de MBeans.


Será por lo tanto,el ServiceController el encargado de gestionar el ciclo de vida de unMBean en base a 4 métodos: (definidos en el interfaz org.jboss.system.Service)

  • el método
    create(ObjectName obj)
    :Éste método de un MBean será invocado cuando seden las condiciones necesarias para que el MBean pueda ser creado.Estas condiciones se darán cuando todos los servicios de los quedepende el MBean en cuestión hayan sido creados. En este punto,un MBean aún no puede usar otros servicios. Este métodopuede verse invocado directamente por el SARDeployer, por lanotificación de una nueva clase o porque otro servicio ha terminado de crearse.
  • el método
    start



    (ObjectName obj)
    : Será invocado cuando 

    todos los servicios de los que depende el MBean en cuestión hayan sido iniciados. 

    Este método puede verseinvocado directamente por el SARDeployer, por la notificación de una nueva clase o porque otro servicio ha terminado de iniciarse. En este momento, el MBean ya se encuentra en un estado funcional.
  • el método
    stop



    (ObjectName obj)




    Estemétodo puede verseinvocado directamente por el SARDeployer, por lanotificación la eliminación de una clase o porque otro servicio ha terminado de pararse.
  • el método
    destroy



    (ObjectName obj)


    Este método puede verseinvocado directamente por el SARDeployer, por la notificación la eliminación de una clase o porque otro servicio ha terminado de destruirse.

En este momento, estamosen disposición de crear un MBean de servicio y registrarlo en el servidor de MBeans. Para ello tenemos tres posibilidades:




  1. Añadir losmétodos del interfaz Service que vayamos a usar al interfaz denuestro MBean (sin necesidad de implementarlo, así evitamos acoplarnos con JBoss)
  2. Extender el interfaz de nuestro MBean del interfaz Service.
  3. Extender el interfazde nuestro MBean del interfaz org.jboss.system.ServiceMBean (método que extiende a Service añadiéndole getName(), getState() y getStateString().

Nosotros vamos a usar la tercera posibilidad para generar nuestro MBean. Primero generaremos el interfaz: (
ojitocon los nombres que usamos, la implementación de JMX de JBossnos obliga a que si la clase del MBean se llama XXX, el interfaz se ha de llamar XXXMBean
)



package com.autentia.tutoriales.jboss.mbeans;





import org.jboss.system.ServiceMBean;





public interface
FechaMBean
extends
ServiceMBean
  {


   
/*  Método que formatea la fecha actual en el formato que le pasemos.

    Si no recibe ningún formato, usa el formato por defecto  */


    public String formatFecha(String formato) throws Exception;


   

   
// Metodos accesores del atributo formato. (formato por defecto)


    public String getFormato();


    public void setFormato(String formato);   


}







Ahora, vamos crear la clase del MBean:


package com.autentia.tutoriales.jboss.mbeans;



import java.text.SimpleDateFormat;

import java.util.Date;

import org.jboss.system.ServiceMBeanSupport;



public class
Fecha
 extends
ServiceMBeanSupport
implements
FechaMBean
{   

    private String formato;



    public String formatFecha(String formatoActual) throws Exception {

        String formatoUsar = this.formato;

        if(formatoActual!=null && !»».equals(formatoActual.trim())) {

            formatoUsar = formatoActual.trim();

        }       

        SimpleDateFormat formatter=new SimpleDateFormat(formatoUsar);

        return formatter.format(new Date());   

    }   

   

    public String getFormato() {       

        return this.formato;

    }



    public void setFormato(String formato) {

        this.formato = formato;       

    }   



    public void create() throws Exception {

        super.create();

        System.out.println(«CREATE: «+getName());       

    }       

   

    public void start() throws Exception {

        super.start();

        System.out.println(«STARTING: «+getName());       

    }

   

    public void stop() {

        super.stop();

       System.out.println(«STOPPING: «+getName());           

    }

   

    public void destroy() {

        super.destroy();

        System.out.println(«DESTROYING: «+getName());       

    }       

}







Hemos extendido la clase ServiceMBeanSupport ya que implementa los métodos

getName(), getState() y getStateString().




Vamos a crear ahora el fichero jboss-service.xml (si quisiérais poner dependencias a otros servicios, este sería el lugar)

<?xml version=»1.0″ encoding=»UTF-8″?>

<server>   

<mbean code=»
com.autentia.tutoriales.jboss.mbeans.Fecha
»            name=»
autentia.tutoriales.paco:service=FormateadorFechaActual
«>

       <attribute name=»
Formato
«>dd/MM/yyyy</attribute>

</mbean>

</server>



(Fijáos en la f mayúscula del nombre del atributo)

Es momento de crear el fichero «date.sar» con la siguente estructura:

   

   
– com/autentia/tutoriales/jboss/mbeans/Fecha


    – com/autentia/tutoriales/jboss/mbeans/FechaMBean



    – META-INF/jboss-service.xml

Desplegadlo en el servidor y vayamos a la consola JMX:

Consola JMX

Seleccionad
«service=FormateadorFechaActual
» :

JMX-Console













Probad el método que hemos creado:

jmx-console



El resultado:

jmx-console

Haced más pruebas, intentad invocadlo usando el adaptador de RMI, etc…




Bueno, como veis, no ha sido demasiado dificil crear nuestro MBean. En el próximo tutorial os propondré crear un XMBean.

Si nos necesitáis, ya sabéis donde buscarnos:
http://www.autentia.com



>






>






>








 












1 Comentario

  1. Buenas
    En cuanto a contenido, encuentro que esta bien.
    Muchas gracias por el curro 🙂

    lo que no encuentro del todo bien es el texto, que en ocsiones aparecen palabras juntas
    nos vemos

Dejar respuesta

Please enter your comment!
Please enter your name here