2011-03-10 12 views
5

Quiero hacer que mi MBean estándar sea detallado en JBoss jmx-console. DynamicMBean tiene getMBeanInfo() para hacerlo. El método devuelve MBeanInfo con la descripción de MBean. Pero, ¿cómo puedo hacer lo mismo con Standard MBean? P.ej. He siguiente interfaz MBean:Descripción de MBean estándar

public interface MyMBean { 
    String f(); 
} 

... con la siguiente implementación:

public class My implements MyMBean { 
    public String f() { 
    return "test"; 
    } 
} 

Lo que se debe hacer para añadir una descripción en estos ejemplos?

Gracias

+0

Según entiendo, Java Doc para MBeanInfo dice que es posible, pero no hay ejemplos y las definiciones son lo suficientemente claras: http://download.oracle.com/javase/1.5.0/docs/api/javax/management /MBeanInfo.html – Raman

Respuesta

4

Para StandardMBeans no hay manera para añadir descripción u otra información meta.

Desde el JavaDoc de MBeanInfo:

Los detalles restantes de la MBeanInfo para un MBean estándar no se especifican. Esto incluye la descripción de MBeanInfo y de los constructores, atributos, operaciones y notificaciones contenidos; y los nombres y descripciones de parámetros para constructores y operaciones.

Por lo tanto, debe utilizar al menos DynamicMBeans (o un ModelMBean o OpenMBean) para especificar esta información. Spring puede ayudarlo en la medida en que permite la creación de DynamicMBeans a través de anotaciones, que al final es incluso más fácil de usar que escribir sus propios StandardMBeans. Ejemplo (de la documentación de primavera):

@ManagedResource(objectName="bean:name=testBean4", 
       description="My Managed Bean") 
public class AnnotationTestBean { 

    private int age; 

    @ManagedAttribute(description="The Age Attribute", currencyTimeLimit=15) 
    public int getAge() { 
     return age; 
    } 
} 

Ver this article para más detalles.

+4

¡Ten en cuenta que esas anotaciones son de primavera! Entonces, si no usas Spring, tampoco puedes usar esas anotaciones. –

+0

La pregunta era sobre JBoss jmx-console –

1

Puede hacerlo a través de un xmbean-descriptor sin la necesidad de modificar el código fuente de mbean existente.

Consulte How to add description for MBean method to see it in jmx-console of JBOSS para una respuesta a esto.

+0

Supongo que esto solo funciona si declaras MBeans declarativamente dentro de JBoss y no cuando los registras programáticamente, p. desde su servlet directamente en un MBeanServer. –

+0

@Roland Sí. Cuando quiera hacerlo programáticamente, puede "ajustar" el StandardMBean existente donde los atributos/operaciones se determinan mirando la interfaz MBean y el DynamicMBean, ya que el wrapper proporciona la información; esto es básicamente lo que hace JBoss; Incluso puede usar la clase desde dentro de JBossAS que hace esto. –

0

La forma de obtener la información de descripción de las anotaciones de Spring @ Managed * es solo para declarar un Spring "bean administrado" estándar, y no un MBean o MXBean.

Para hacer esto, en su ejemplo, no debe implementar la interfaz con el sufijo "MBean". Luego, el bean se detectará como un "bean administrado" estándar cuando MBeanExporter registrará BeanInstance (..), y se convertirá a un ModelMBean usando todas las anotaciones de primavera, incluyendo descripciones de atributos, operaciones, parámetros, etc.

Como requisito, se debe declarar en su contexto la primavera del MBeanExporter con AnnotationJmxAttributeSource, MetadataNamingStrategy, y MetadataMBeanInfoAssembler atributos, que se puede simplificarse así:

<bean id="mbeanExporter" 
    class="org.springframework.jmx.export.annotation.AnnotationMBeanExporter" /> 

o

<context:mbean-export /> 

Y el bean administrado debe tener este aspecto (como se explica por Roland):

@Component("myManagedBean") 
@ManagedResource(objectName="your.domain.jmx:name=MyMBean", 
       description="My MBean goal") 
public class AnnotationTestBean { 

    private int age; 

    @ManagedAttribute(description="The age attribute", currencyTimeLimit=15) 
    public int getAge() { 
     return age; 
    } 

    @ManagedOperation(description = "Check permissions for the given activity") 
    @ManagedOperationParameters({ 
     @ManagedOperationParameter(name = "activity", 
            description = "The activity to check") 
    }) 
    public boolean isAllowedTo(final String activity) { 
     // impl 
    } 
} 

Recuerde que no implementa una interfaz MBean, lo que sería un StandardMBean !!