2012-10-30 38 views
6

मैं वर्तमान में जावा के लिए वर्चुअल फाइल सिस्टम http://truevfs.java.net पर काम कर रहा हूं। TrueVFS मॉड्यूलर है और कुछ भी कॉन्फ़िगर करने की आवश्यकता के बिना रन-टाइम पर सुविधाओं को लोड करने के लिए प्लग-इन आर्किटेक्चर का उपयोग करता है। कुछ वैकल्पिक प्लग-इन निगरानी और प्रबंधन के लिए परिभाषित ऑब्जेक्ट नामों के साथ एमबीएन पंजीकृत करने के लिए प्लेटफ़ॉर्म एमबीन सर्वर का उपयोग करते हैं।कौन सा एमबीन सर्वर का उपयोग टॉमकैट, वेबलोगिक, ग्लासफ़िश एट अल में करना है?

अब मेरे कुछ उपयोगकर्ता टॉमकैट एट अल पर तैनाती के लिए अपने WAR में TrueVFS JARs को बंडल कर रहे हैं। यह ठीक काम कर रहा है जब तक कि वे जेएमएक्स सक्षम प्लग-इन में से एक को शामिल न करें और विभिन्न संदर्भों पर युद्ध के कई उदाहरणों को तैनात करें।

यह काम नहीं करता है क्योंकि प्रत्येक वेब ऐप में जेएमएक्स सक्षम प्लग-इन की अपनी क्लास लोडर परिभाषा होती है, लेकिन वे सभी एक ही मंच एमबीएएन सर्वर साझा करेंगे और उसी एमबीएन पंजीकृत करने के लिए उसी ऑब्जेक्ट नाम का उपयोग करेंगे, इसलिए एक है टक्कर।

अब मैं इस समस्या को कैसे हल कर सकता हूं? मैंने पहले से ही एमबीनसेवर लुकअप को सारणीबद्ध कर दिया है ताकि मैं इसे किसी अन्य प्लग-इन में निकाल सकूं, लेकिन मैं आम तौर पर लागू रणनीति की पहचान नहीं कर सकता जो एमबीन सर्वर मुझे अपने एमबीन पंजीकृत करने के लिए उपयोग करना चाहिए।

मैंने विषय को गुगल किया और कुछ documentation for WebLogic पाया जो इंगित करता है कि मुझे जेएनडीआई का उपयोग करके एमबीनसेवर को देखना चाहिए। हालांकि, यह WebLogic के लिए विशिष्ट प्रतीत होता है।

क्या कोई सामान्य आकार-फिट-सभी दृष्टिकोण नहीं है?


अद्यतन:

import java.lang.management.ManagementFactory; 
import javax.management.JMX; 
import javax.management.MBeanServer; 
import javax.management.ObjectName; 

public class Messenger implements MessengerMXBean { 

    private static MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); 

    public static void main(String[] args) throws Exception { 
     register("one"); 
     register("two"); 
     find(); 
     System.out.println("Waiting for interrupt..."); 
     Thread.sleep(Long.MAX_VALUE); 
    } 

    private static void register(String context) throws Exception { 
     mbs.registerMBean(new Messenger(), 
       new ObjectName(":type=Messenger,context=" + context)); 
    } 

    private static void find() throws Exception { 
     for (ObjectName name : mbs.queryNames(new ObjectName(":type=Messenger,*"), null)) 
      System.out.println(JMX.newMXBeanProxy(mbs, name, MessengerMXBean.class).getMessage()); 
    } 

    public String getMessage() { return "Hello world!"; } 
} 

public interface MessengerMXBean { String getMessage(); } 

जैसी उम्मीद थी, इस कार्यक्रम के रजिस्टरों:

यहां एक त्वरित सबूत अवधारणा-का-एक अतिरिक्त संपत्ति का उपयोग कर वेब अनुप्रयोग परिभाषित वर्ग लोडर की पहचान करने के लिए है दो मैसेंजर एमबीन, उन्हें पाता है और उनके "हैलो वर्ल्ड!" प्रिंट करता है संदेश।

हालांकि, इस समाधान के लिए नुकसान कर रहे हैं:

  • मैं एक पहचानकर्ता के रूप में एक अतिरिक्त संपत्ति नकली करने के लिए है। आदर्श रूप से यह वर्ग लोडर के लिए एक पहचानकर्ता होगा ताकि मैं सामान्य उद्देश्य बना सकूं, यानी वेब ऐप्स के लिए विशेष विचार न करें।
  • एमबीन को देखकर अब कई वर्ग लोडरों के विशेष मामले पर विचार करना आवश्यक है, यानी एमबीन के कई उदाहरण जो केवल उनके अतिरिक्त क्वालीफायर से भिन्न होते हैं, भले ही एप्लिकेशन स्टैंडअलोन चल रहा हो।

ये गंभीर की कमी कर रहे हैं, लेकिन ऐसा लगता है मैं कोई बेहतर विकल्प होता है, तो मैं शायद इस तरह से जाना जाएगा।

+0

मैं शायद क्लास लोडर आर्किटेक्चर पर आधारित कुछ स्विच जोड़ूंगा: यदि एमबीन क्लास और एमबीन सर्वर क्लास को विभिन्न वर्ग लोडर द्वारा परिभाषित किया गया है, तो मैं ऑब्जेक्टनाम में एमबीन क्लास लोडर के लिए एक पहचानकर्ता जोड़ूंगा। अन्यथा, मैं कुछ भी नहीं जोड़ूंगा। –

उत्तर

4

आप प्रत्येक युद्ध मॉड्यूल के लिए एक नया एमबीन सर्वर दोबारा बना सकते हैं। हालांकि, जब उन्हें जेएसआर -160 क्लाइंट के बाहर से पूछताछ की जाती है तो आपको एमबीन सर्वर भी निर्दिष्ट करना होगा।

जब आप Jolokia का उपयोग कर रहे हैं तो आपको JVM के सभी MBeanServers का एक पारदर्शी विलय मिलता है। हालांकि, यह यहां या तो मदद नहीं करेगा जब आपके पास समान नाम वाले एमबीएन्स हों, जहां केवल एक ही पहुंच योग्य होगा।

इस स्थिति के लिए मेरा समाधान उसी एमबीन सर्वर का उपयोग करना है, लेकिन विभिन्न नामों के साथ एमबीन का उपयोग करना है।आप उन एमबीन के लिए पूरी तरह से ऑर्थोगोनल डोमेन का उपयोग कर सकते हैं या अन्य गुणों के अतिरिक्त नाम में अतिरिक्त "क्वालीफायर" कुंजी-मूल्य जोड़ी जैसे कुछ जोड़ सकते हैं। जब मैं सामान्य परिस्थितियों के लिए केवल एक एमबीन की अपेक्षा करता हूं, तो मैं पहले एक निश्चित नाम के साथ एमबीन जोड़ने की कोशिश करता हूं। यदि यह विफल हो जाता है, तो मैं स्वचालित रूप से स्वचालित रूप से जेनरेट किए गए मान के साथ नाम पर एक और ",qualifier=..." भाग जोड़ता हूं, जिसे किसी विशिष्ट मूल्य (जैसे WAR नाम) या यहां तक ​​कि कॉन्फ़िगर करने योग्य व्यक्ति द्वारा विशिष्ट रूप से पहचाना जा सकता है।

असल में, कई एमबीनसेवर से निपटना वास्तव में ग्राहकों के परिप्रेक्ष्य से दर्द है इसलिए जेएमएक्स का उपयोग अद्वितीय नाम (वैश्विक रूप से जेनरेट किए गए एमबीन नाम) के साथ वैश्विक नामस्थान के रूप में करना आसान विकल्प है।

+0

मैं एक अतिरिक्त क्वालीफायर का उपयोग करने की कोशिश करूंगा जो क्लास लोडर की पहचान करता है। यह स्टैंडअलोन काम करना चाहिए। मुझे नहीं पता कि यह ग्राहकों द्वारा लुकअप को कैसे प्रभावित करता है। एक स्टैंडअलोन एप्लिकेशन में, अतिरिक्त क्वालीफायर प्रदान करना आवश्यक नहीं होना चाहिए। –