2011-03-29 9 views
6

का पता लगाने मैं जावा 1.6 में प्लेटफार्म एमबीएन्स सर्वर का उपयोग कर रहा हूं, जो ओएसजीआई कंटेनर में चल रहा है।नए पंजीकृत एमबीएन

सांख्यिकीय काउंटर और घटनाओं के लिए मुख्य रूप से एमबीन का उपयोग करना। उनके कार्यान्वयन एक बंडल में हैं, लेकिन वे कई अन्य बंडलों में तत्काल हैं। मंच एमबीन सर्वर के साथ हर एमबीन autoregisters खुद।

समस्या यह है कि जब मैं जेएमएक्स के माध्यम से संलग्न करता हूं और एमबीएन्स के लिए पूछताछ करता हूं, तो मुझे केवल उन लोगों को मिलता है जो वर्तमान में पंजीकृत हैं, और जब तक उन्हें तत्काल नहीं किया जाता है तब तक वे पंजीकृत नहीं होंगे (या तो क्योंकि स्थिर कक्षाएं पहले तक मौजूद नहीं होती हैं एक्सेस, या क्योंकि बंडल अभी तक शुरू नहीं हुआ है, या काउंटर कुछ तर्क में गहरा है जो पहले उपयोग तक मौजूद नहीं है)

मुझे एमबीएन्स सर्वर में "रजिस्टर" ईवेंट की सदस्यता लेने का कोई तरीका चाहिए। या यह निर्धारित करने का कोई अन्य तरीका है कि सर्वर में जोड़े गए नए एमबीएन्स कब हैं। हटाए गए एमबीन का पता लगाना एक अतिरिक्त बोनस होगा, लेकिन आवश्यक नहीं है।

मुझे मिला एकमात्र समाधान मूल रूप से एक धागा है जो हर 5 सेकंड में सर्वर को चुनाव करता है और परिणाम की तुलना एमबीन की सहेजी गई सूची के साथ करता है, और यह काफी बदसूरत है।

उत्तर

12

सभी अनुपालन एमबीन सर्वर एमबीन पंजीकरण और अनियंत्रण कार्यक्रमों के श्रोताओं को सूचित करेंगे। कुंजी MBNanServerDelegate पर अधिसूचना श्रोता पंजीकृत करने के लिए है।

उदाहरण के लिए, एक 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 के खिलाफ अधिसूचना श्रोता जोड़ें। आप MBeanServerNotificationFilter का उपयोग कर सकते हैं यदि आप फ़िल्टर करना चाहते हैं कि आप किस एमबीआईएन के बारे में वास्तव में अधिसूचित हैं। इस उदाहरण में, फ़िल्टर सभी ऑब्जेक्ट नामों के लिए सक्षम है।

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

आपका श्रोता कार्यान्वयन प्रत्येक बार एमबीन पंजीकृत या अनियंत्रित होने पर कॉलबैक प्राप्त करेगा।

3

ऐसा लगता है कि आप सभी एमबीन देखना चाहते हैं जो कहीं भी मौजूद हैं लेकिन आप तब से नहीं कर सकते जब कोड एक साथ में सभी को नहीं बनाता है।

मैं एक कोड जेनरेटर का उपयोग करने का सुझाव देता हूं जो सभी वास्तविक एमबीन के लिए "दृश्य" एमबीन बनाता है। उदाहरण के लिए एमबीएन्स का पता लगाने के लिए कक्षा या मार्कर इंटरफ़ेस का उपयोग करें। दृश्य बीन्स सभी स्टार्टअप पर बनाया जाना चाहिए।

अब जब वास्तविक एमबीन आता है, तो इसे अपने विचार को देखना चाहिए और खुद को हुक करना चाहिए।

इस तरह, सभी एमबीन हमेशा दिखाई देंगे, स्टार्टअप ज्यादा पीड़ित नहीं होगा (क्योंकि दृश्य एमबीएन वास्तव में सस्ते होंगे) और दृश्य एमबीन आपको वास्तविक एमबीन की स्थिति बता सकते हैं।

[संपादित करें] तुम सच में ही पता करने के लिए जब एक नया MBean पंजीकृत किया गया है की जरूरत है, एक मौजूदा MBeanServer का विस्तार करने और registerMBean(Object, ObjectName) ओवरराइड। सिस्टम प्रॉपर्टी javax.management.builder.initial सेट करके नया MBeanServer इंस्टॉल करें।

अब एक एमबीन परिभाषित करें जो इस जानकारी को उजागर करता है।

+0

मैं उम्मीद कर रहा था कि ऐसा करने का एक आसान तरीका था :( जैसे कि "नए पंजीकरण के लिए सुनो" घटना किसी अनियंत्रित एपीआई या किसी चीज़ में कहीं गहरी है .. – MarcB

+0

यह आपकी मुख्य समस्या का समाधान नहीं करता है: एमबीआईएन देखना जो अभी पंजीकृत नहीं है, अभी तक। –

+0

ठीक है, मुझे उन्हें देखने की ज़रूरत नहीं है जब वे पंजीकृत नहीं हैं (हालांकि यह अच्छा होगा)। पंजीकृत होने पर पता लगाना पर्याप्त होगा। – MarcB

संबंधित मुद्दे