MBeans y JBoss
-
Jboss Eclipse IDE Milestone 5.
-
JDK 1.5
-
JBoss 4.0.5 GA
>
INTRODUCCION
.
JMX es un estándar para gestionar y monitorizar gran variedad de componentes, tanto hardware como software desde Java.
-
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.
>
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/
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:
Una vez seleccionado, pulsad sobre el método list:
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:
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:
-
Añadir losmétodos del interfaz Service que vayamos a usar al interfaz denuestro MBean (sin necesidad de implementarlo, así evitamos acoplarnos con JBoss)
-
Extender el interfaz de nuestro MBean del interfaz Service.
-
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″?>
<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:
Seleccionad
«service=FormateadorFechaActual
» :
Probad el método que hemos creado:
El resultado:
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
>
>
>
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