Consultor tecnológico de desarrollo de proyectos informáticos.
Ingeniero Técnico en Telecomunicaciones
Puedes encontrarme en Autentia: Ofrecemos servicios de soporte a desarrollo, factoría y formación
Somos expertos en Java/J2EE
Regístrate para votar
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.
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.
- 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.
- 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().
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:
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>
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 " :
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
>
>
>
Puedes opinar o comentar cualquier sugerencia que quieras comunicarnos sobre este tutorial; con tu ayuda, podemos ofrecerte un mejor servicio.








