2011-03-29 11 views
6

Estoy usando la plataforma del servidor MBeans en Java 1.6, ejecutándose en un contenedor OSGi.Detectando nuevos MBeans registrados

Uso de los MBeans para contadores de estadísticas y eventos principalmente. La implementación de ellos está en un paquete, pero se crean instancias en varios otros paquetes. Cada MBean se autoregistra automáticamente con la plataforma del servidor MBean.

El problema es que cuando me conecto a través de JMX y busco MBeans, solo obtengo los que están actualmente registrados, y no se registrarán hasta que se hayan instanciado (porque las clases estáticas no existen hasta el primero acceso, o porque el paquete no ha comenzado todavía, o el contador está en una lógica que no existirá hasta el primer uso)

Necesito alguna forma de suscribirse a los eventos de "registro" en el servidor MBeans. O de alguna otra forma de determinar cuando hay nuevos MBeans agregados al servidor. La detección de MBeans eliminados sería una ventaja adicional, pero no necesaria.

La única solución que tengo es básicamente un hilo que sondea el servidor cada 5 segundos y compara el resultado con una lista guardada de MBeans, y eso es bastante feo.

Respuesta

12

Todos los MBeanServers compatibles notificarán a los oyentes de los eventos de registro y anulación de registro de MBean. La clave es registrar un oyente de notificación en el MBeanServerDelegate.

Por ejemplo, una aplicación javax.management.NotificationListener:

public class MBeanEventListener implements NotificationListener { 
    public void handleNotification(Notification notification, Object handback) { 
     MBeanServerNotification mbs = (MBeanServerNotification) notification; 
     if(MBeanServerNotification.REGISTRATION_NOTIFICATION.equals(mbs.getType())) { 
      log("MBean Registered [" + mbs.getMBeanName() + "]"); 
     } else if(MBeanServerNotification.UNREGISTRATION_NOTIFICATION.equals(mbs.getType())) { 
      log("MBean Unregistered [" + mbs.getMBeanName() + "]"); 
     } 
    }  
} 

para registrar el detector, añadir el detector de notificación en contra de la MBeanServerDelegate. Puede usar un MBeanServerNotificationFilter si desea filtrar los MBeans de los que realmente se le notifica. En este ejemplo, el filtro está habilitado para todos los ObjectNames.

// Get a reference to the target MBeanServer 
    MBeanServerConnection server = ManagementFactory.getPlatformMBeanServer(); 
    MBeanServerNotificationFilter filter = new MBeanServerNotificationFilter(); 
    filter.enableAllObjectNames(); 
    server.addNotificationListener(MBeanServerDelegate.DELEGATE_NAME, new MBeanEventListener(), filter, null); 

Su implementación del receptor obtendrá una devolución de llamada cada vez que un MBean está registrado o no registrado.

3

Parece que le gustaría ver todos los MBeans que existen en cualquier lugar, pero no puede, ya que el código no los crea todos a la vez.

Sugiero usar un generador de código que crea MBeans "ver" para todos los MBeans reales. Por ejemplo, use una clase o una interfaz de marcador para ubicar MBeans. Los beans de vista deben ser creados al inicio.

Ahora cuando aparece el MBean real, debe mirar hacia arriba para verlo y conectarlo.

De esta forma, todos los MBeans siempre estarán visibles, el inicio no sufrirá mucho (ya que los MBeans de la vista serán realmente baratos) y la vista MBeans puede decirle el estado de los MBeans reales.

[EDIT] Si realmente sólo necesita saber cuando se ha registrado un nuevo MBean, extender una MBeanServer existente y anular registerMBean(Object, ObjectName). Instale el nuevo MBeanServer estableciendo la propiedad del sistema javax.management.builder.initial.

Defina ahora un MBean que expone esta información.

+0

Esperaba que hubiera una manera significativamente más fácil de hacerlo :( Como un evento de "escuchar para nuevos registros" en algún lugar de una API indocumentada o algo así ... – MarcB

+0

Eso no resuelve su problema principal: ver MBeans que aún no se han registrado. –

+0

Bueno, no tengo que verlos cuando no están registrados (aunque sería bueno). Averiguar cuándo están registrados sería suficiente. – MarcB