Java 标准MBean的描述

Java 标准MBean的描述,java,jboss,jmx,Java,Jboss,Jmx,我想在JBoss jmx控制台中使我的标准MBean变得冗长。DynamicBean有getMBeanInfo()来完成此操作。方法返回带有MBean描述的MBeanInfo。但是我怎么能为标准MBean做同样的事情呢?例如,我有以下MBean接口: public interface MyMBean { String f(); } 。。。实施情况如下: public class My implements MyMBean { public String f() { return

我想在JBoss jmx控制台中使我的标准MBean变得冗长。DynamicBean有getMBeanInfo()来完成此操作。方法返回带有MBean描述的MBeanInfo。但是我怎么能为标准MBean做同样的事情呢?例如,我有以下MBean接口:

public interface MyMBean {
  String f();
}
。。。实施情况如下:

public class My implements MyMBean {
  public String f() {
    return "test";
  }
}
在这样的示例中,应该如何添加描述


感谢使用StandardMBeans,无法添加描述或其他元信息

MBeanInfo
的JavaDoc:

未指定标准MBean的MBeanInfo的其余详细信息。这包括对MBeanInfo和任何包含的构造函数、属性、操作和通知的描述;以及构造函数和操作的参数名称和说明

因此,您至少需要使用DynamicBeans(或ModelMBean或OpenMBean)来指定此信息。Spring可以帮助您,因为它允许通过注释创建DynamicBeans,最后使用注释比编写自己的StandardMBean更简单。示例(来自spring文档):


有关详细信息,请参阅。

您可以通过xmbean描述符执行此操作,而无需修改现有mbean源代码


请参阅以获取对此的答案。

从Spring annotations@Managed*获取描述信息的方法只是声明一个标准的Spring“托管bean”,而不是MBean或MXBean

要做到这一点,在您的示例中,您不能实现带有“MBean”后缀的接口。 然后,当MBeanExporter将registerBeanInstance(..)时,该bean将被检测为标准的“托管bean”,并将使用所有spring注释(包括属性、操作、参数等的描述)转换为ModelMBean

作为一项要求,您应该在spring上下文中声明带有注释jmxattributesourceMetadataNamingStrategyMetadataMBeanInfoAssembler属性的MBeanExporter,这些属性可以简化为:

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

记住不要实现MBean接口,这将是一个标准MBean

当我理解Java Doc for MBeanInfo时,我说这是可能的,但是没有任何示例和定义是不够清楚的:请注意,这些注释来自Spring!因此,如果您不使用Spring,您也不能使用这些注释。问题是关于JBoss jmx控制台的。我想这只适用于在JBoss中声明MBean,而不是在通过编程注册MBean时(例如,从servlet中直接在MBeanServer上注册)。@Roland Yes。当您想以编程的方式进行时,您仍然可以“包装”现有的StandardMBean,其中属性/操作通过查看MBean接口和DynamicBean来确定,因为包装器提供了信息——这基本上就是JBoss所做的;您甚至可以使用JBossAS中的类来实现这一点。
<bean id="mbeanExporter"
     class="org.springframework.jmx.export.annotation.AnnotationMBeanExporter" />
<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
    }
}