2011-03-29 73 views
6

我在Java 1.6中使用平臺MBeans服務器,運行在OSGi容器中。檢測新註冊的MBean

主要使用MBeans進行統計計數器和事件。它們的實現在一個bundle中,但是它們在其他幾個bundle中實例化。每個MBean都使用平臺MBean服務器進行自我修復。

問題是,當我通過JMX連接並查詢MBean時,我只獲取那些當前已註冊的,並且在它們被實例化之前不會被註冊(因爲靜態類直到第一個訪問,或者是因爲捆綁尚未啓動,或者計數器在某些邏輯不會存在,直到第一次使用)

深,我需要訂閱「註冊」中的MBean服務器事件的某種方式。或者確定何時將新MBean添加到服務器的其他方式。檢測到已刪除的MBean將是額外的好處,但不是必需的。

我得到的唯一解決方案基本上是一個線程,每5秒鐘輪詢一次服務器,並將結果與​​保存的MBean列表進行比較,這相當難看。

回答

12

所有兼容的MBeanServers都會通知監聽器MBean註冊和註銷事件。關鍵是在MBeanServerDelegate上註冊一個通知偵聽器。

例如,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() + "]"); 
     } 
    }  
} 

要註冊監聽器,添加通知偵聽器對MBeanServerDelegate。如果您想過濾實際通知您的MBean,則可以使用MBeanServerNotificationFilter。在此示例中,爲所有ObjectName啓用了篩選器。

// 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); 

您的監聽器實現將在每次MBean註冊或取消註冊時得到一個回調。

3

這聽起來像您希望看到所有存在於任何位置的MBean,但您不能一次性創建所有MBean。

我建議使用代碼生成器爲所有真實的MBean創建「視圖」MBean。例如,使用類或標記接口來定位MBean。視圖bean應該全部在啓動時創建。

現在,當真正的MBean出現時,它應該仰視它的視圖並將自己掛鉤。這樣,所有MBean將始終可見,啓動不會受到太多影響(因爲MBean將非常便宜),並且視圖MBean可以告訴您實際MBean的狀態。

[編輯]如果你真的只需要知道當一個新的MBean被註冊,擴展現有MBeanServer並覆蓋registerMBean(Object, ObjectName)。通過設置系統屬性javax.management.builder.initial安裝新的MBeanServer

現在定義一個公開此信息的MBean。

+0

我很希望有一個更簡單的方法來做到這一點:( 如「偵聽新的註冊」事件深處的未公開的API或什麼東西.. – MarcB 2011-03-29 08:39:46

+0

這並不能解決您的主要問題:查看尚未註冊的MBean。 – 2011-03-29 10:23:29

+0

那麼,我沒有看到他們,當他們沒有註冊(雖然那會很好)。 查明他們註冊的時間就足夠了。 – MarcB 2011-03-29 10:27:40