Описание стандартного MBean

Я хочу сделать свой стандартный MBean подробным в JBoss jmx-консоли. В DynamicMBean для этого есть функция getMBeanInfo(). Метод возвращает MBeanInfo с описанием MBean. Но как я могу сделать то же самое для стандартного MBean? Например. У меня есть следующий интерфейс MBean:

public interface MyMBean {
  String f();
}

... со следующей реализацией:

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

Что нужно сделать, чтобы добавить описание в таком примере?

Спасибо


person Raman    schedule 10.03.2011    source источник
comment
Насколько я понимаю, Java Doc для MBeanInfo говорит, что это возможно, но примеров нет, и определения достаточно неясны: download.oracle.com/javase/1.5.0/docs/api/javax/management/   -  person Raman    schedule 10.03.2011


Ответы (3)


Для StandardMBeans нет возможности добавить описание или другую метаинформацию.

Из JavaDoc MBeanInfo:

Остальные детали MBeanInfo для стандартного MBean не указаны. Сюда входит описание MBeanInfo и любых содержащихся в нем конструкторов, атрибутов, операций и уведомлений; а также имена и описания параметров конструкторов и операций.

Поэтому вам нужно использовать по крайней мере DynamicMBeans (или ModelMBean или OpenMBean) для указания этой информации. Spring может помочь вам, поскольку он позволяет создавать DynamicMBeans с помощью аннотаций, которые, в конце концов, даже проще использовать, чем писать собственные StandardMBeans. Пример (из весенней документации):

@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;
    }
}

См. эту статью. для получения подробной информации.

person Roland Huß    schedule 11.03.2011
comment
Обратите внимание, что эти аннотации относятся к Spring! Поэтому, если вы не используете Spring, вы также не можете использовать эти аннотации. - person Joachim Sauer; 11.03.2011
comment
Вопрос был про JBoss jmx-консоль - person Heiko Rupp; 13.03.2011

Вы можете сделать это с помощью дескриптора xmbean без необходимости изменять существующий исходный код mbean.

См. Как добавить описание метода MBean, чтобы увидеть его в jmx-консоли JBOSS для ответа на этот вопрос.

person Heiko Rupp    schedule 13.03.2011
comment
Я предполагаю, что это работает только в том случае, если вы объявляете свои MBeans декларативно в JBoss, а не когда вы регистрируете их программно, например. из вашего сервлета непосредственно на MBeanServer. - person Roland Huß; 16.03.2011
comment
@ Роланд Да. Если вы хотите сделать это программно, вы все равно можете обернуть существующий StandardMBean, где атрибуты/операции определяются путем просмотра интерфейса MBean, а DynamicMBean, поскольку обертка предоставляет информацию - это в основном то, что делает JBoss; Вы даже можете использовать класс из JBossAS, который делает это. - person Heiko Rupp; 16.03.2011

Чтобы получить информацию описания из аннотаций Spring @Managed*, нужно просто объявить стандартный "управляемый компонент" Spring, а не MBean или MXBean.

Для этого в вашем примере вы не должны реализовывать интерфейс с суффиксом "MBean". Затем компонент будет определен как стандартный «управляемый компонент», когда MBeanExporter зарегистрируетBeanInstance(..) и будет преобразован в ModelMBean с использованием всех аннотаций Spring, включая описания атрибутов, операций, параметров и т. д.

В качестве требования вы должны объявить в контексте весны MBeanExporter с атрибутами AnnotationJmxAttributeSource, MetadataNamingStrategy и MetadataMBeanInfoAssembler, который можно упростить следующим образом:

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

or

<context:mbean-export />

И ваш управляемый компонент должен выглядеть так (как объяснил Роланд):

@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
    }
}

Помните, что нельзя реализовывать интерфейс MBean, который был бы StandardMBean!!

person Donatello    schedule 06.09.2012