2011-03-10 122 views
5

我想在JBoss jmx-console中使我的標準MBean冗長。 DynamicMBean有getMBeanInfo()來做到這一點。方法返回帶有MBean描述的MBeanInfo。但是我怎麼能爲Standard MBean做同樣的事情?例如。我有以下MBean接口:標準MBean描述

public interface MyMBean { 
    String f(); 
} 

...用下面的實現:

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

應該怎樣做,以這樣的例子添加描述?

感謝

+0

正如我對MBeanInfo的Java Doc的理解所說,這是可能的,但沒有任何示例和定義足夠不清楚:http://download.oracle.com/javase/1.5.0/docs/api/javax/management /MBeanInfo.html – Raman 2011-03-10 14:44:02

回答

4

對於StandardMBeans沒有辦法添加描述或其他元數據信息。

MBeanInfo的JavaDoc:爲Standard MBean的MBeanInfo的

其餘細節沒有規定。這包括對MBeanInfo和任何包含的構造函數,屬性,操作和通知的描述;以及構造函數和操作的參數名稱和描述。

因此,您至少需要使用DynamicMBean(或ModelMBean或OpenMBean)來指定此信息。 Spring可以幫助你,因爲它允許通過註釋創建DynamicMBeans,最後使用它比編寫自己的StandardMBeans更簡單。示例(來自spring文檔):

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

有關詳細信息,請參見this article

+4

請注意,這些註釋來自Spring!所以如果你不使用Spring,你也不能使用這些註釋。 – 2011-03-11 08:12:16

+0

這個問題是關於JBoss jmx-console – 2011-03-13 09:41:56

1

您可以通過xmbean描述符來完成此操作,而無需修改現有的mbean源代碼。

請參閱How to add description for MBean method to see it in jmx-console of JBOSS獲取答案。

+0

我想這隻有在你在JBoss中聲明MBeans而不是當你在程序中註冊它時從您的servlet直接在MBeanServer中。 – 2011-03-15 22:18:15

+0

@Roland是的。當你想以編程方式執行時,通過查看MBean接口和DynamicMBean作爲包裝器提供的信息,您仍然可以「包裝」現有的StandardMBean,其中屬性/操作是由其確定的 - 這基本上是JBoss所做的;你甚至可以在JBossAS中使用這個類。 – 2011-03-16 07:26:47

0

從Spring annotations @ Managed *獲取描述信息的方法是聲明一個標準的Spring「託管bean」,而不是MBean或MXBean。

爲此,在您的示例中,您不得使用「MBean」後綴實現接口。 然後,當MBeanExporter將registerBeanInstance(..)並且將使用所有Spring註解(包括屬性,操作,參數等的描述)將其轉換爲ModelMBean時,該bean將被檢測爲標準的「託管bean」。

這樣的要求,你應該在你的Spring上下文聲明的MBeanExporterAnnotationJmxAttributeSource類MetadataNamingStrategy,並MetadataMBeanInfoAssembler的屬性,它可以簡化如下:

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

<context:mbean-export /> 

和你的託管bean應該是這樣的(由羅蘭解釋):

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