2012-12-03 34 views
13

OSGI Enterprise Release 5 specification के अध्याय 126 अनुकूलता का उल्लेख है: "। समर्थन पारंपरिक JNDI प्रोग्रामिंग जावा SE और जावा ईई ग्राहकों द्वारा इस्तेमाल किया मॉडल"क्या ओएसजीआई जेएनडीआई गैर-ओएसजीआई कोड से जेएनडीआई कॉल के साथ सह-अस्तित्व की अनुमति देता है?

और OSGi-अनजान कोड का उपयोग करें:

"ग्राहक और JNDI प्रसंग प्रदाताओं कि OSGi से अनजान हैं स्थिर तरीकों का उपयोग JRE JNDI कार्यान्वयन से कनेक्ट करने के InitialContext वर्ग एक के लिए उपयोग प्रदान करता है। प्रदाता से संदर्भ और प्रदाता ऑब्जेक्ट रूपांतरण करने और URL संदर्भों को खोजने के लिए स्थिर नामकरण प्रबंधक विधियों का उपयोग करते हैं। यह पारंपरिक मॉडल ओएसजीआई से अवगत नहीं है और इसलिए ओएसजीआई जागरूकता की इस कमी के परिणाम के परिणामस्वरूप विश्वसनीय रूप से उपयोग किया जा सकता है। "

लेकिन यह मेरे लिए स्पष्ट नहीं है कि इस पाठ केवल "विरासत" कोड एक OSGi बंडल के अंदर निष्पादित करने के लिए, या भी OSGi कंटेनर के बाहर कोड करने के लिए लागू होता है, एक परिदृश्य में च पूर्व जहां OSGi कंटेनर में एम्बेडेड है एक आवेदन पत्र।

एक एम्बेडिंग परिदृश्य में, ओएसजीआई कंटेनर के बाहर और अंदर दोनों में कोड कोड हो सकता है जो जेएनडीआई कॉल करता है, और जैसे ही वे एक ही जेवीएम में निष्पादित होते हैं, वे जेएनडीआई कार्यान्वयन साझा करेंगे।

प्रश्न: चाहिए एक एम्बेडेड OSGi कंटेनर में एक OSGi JNDI कार्यान्वयन चल अपने JNDI सामान्य की तरह कहता है, या कुछ पोर्टिंग के लिए "OSGi जागरूकता" आवश्यक है प्रदर्शन करने के लिए कंटेनर के बाहर OSGi-अनजान कोड की अनुमति देते हैं?

अपाचे कराफ 2.3.0 (जो अपाचे मेष जेएनडीआई 1.0.0 का उपयोग करता है) के साथ इसे स्वयं करने का प्रयास करता है, यह काम नहीं लगता है, क्योंकि अपाचे मेष को जेएनडीआई क्लाइंट कॉल को ओएसजीआई बंडल से उत्पन्न करने की आवश्यकता होती है।
आंशिक स्टैकट्रेस: ​​

javax.naming.NoInitialContextException: The calling code's BundleContext could not be determined. 
    at org.apache.aries.jndi.OSGiInitialContextFactoryBuilder.getInitialContext(OSGiInitialContextFactoryBuilder.java:46) 
    at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:684) 
    at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:307) 
    at javax.naming.InitialContext.init(InitialContext.java:242) 
    at javax.naming.InitialContext.<init>(InitialContext.java:192) 

प्रश्न: यह सही व्यवहार है, या वहाँ विनिर्देश मुझे लगता है कि उल्लेख कर सकते हैं का एक वर्ग इस सीमा का उल्लंघन कर रहा है?

उत्तर

0

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

मैं जेएनडीआई द्वारा आवश्यक सभी जारों के साथ एकल बंडल बनाने और सभी पैकेजों को निर्यात करने की सलाह दूंगा। फिर इसका उपयोग करने के लिए गतिशील-आयात: * का उपयोग करें। यह हमारे मामले में काम करता है (ईजेबीएस कॉल के लिए इस्तेमाल किए गए जेबॉस 5 जेएनडीआई के साथ ग्रहण आरसीपी आवेदन)।

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

1

वेबलॉग पर अपाचे करफ को तैनात करने की कोशिश करते समय मैं एक ही समस्या में भाग गया। हम एक सर्वलेट पुल के माध्यम से कराफ का उपयोग करते हैं - वेबलॉगिक में एक युद्ध तैनात किया जाता है जो सभी http अनुरोधों को कराफ में पुल करता है।

मैं weblogic पर निम्नलिखित अनुप्रयोगों के साथ चला रहा हूँ:

  1. APP1 जैसे ही
  2. APP2
  3. karaf-पुल (Karaf को पुलों अनुरोध)

(JNDI उपयोग करता है) जैसा कि कराफ ने आरएएस के अंदर चलने वाली मेष जेएनडीआई कार्यान्वयन शुरू किया है, जेविक्स.नामिंग के अंदर InitialContextFactoryBuilder सेट करता है। नामकरण प्रबंधक अपने स्वयं के कार्यान्वयन के लिए। नामकरण प्रबंधक प्रारंभिक संदर्भ फैक्ट्री बिल्डर के लिए एक स्थिर संदर्भ रखता है, इसलिए जो भी कार्यान्वयन हो, चाहे वह ओएसजीआई पर्यावरण में चल रहा हो, इस स्थिर संदर्भ को जेएनडीआई प्रदाता बनता है।

मेरे मामले में जब ऐप 1 (गैर-ओएसजीआई) एक नया InitialContext करने का प्रयास करता है, मेष JNDI BundleContext का उपयोग करके इसे हल करने का प्रयास करता है और विफल रहता है।

मैंने कुछ बहुत बदसूरत हैक्स का उपयोग करके इसे ठीक किया है जिसमें javax.naming पैकेज को जेरे से निकालने और इसे कराफ में एक बंडल के रूप में स्थापित करने में शामिल है।

तो आपके प्रश्न का उत्तर: मुझे लगता है कि यह मुद्दा वास्तव में जेआरई में है और ओएसजीआई के साथ नहीं है कि जेएनडीआई लुकअप कैसे प्रबंधित किया जाता है।

0

अपाचे मेष ने इस बारे में सोचा है और जेआरई प्रारंभिक संदर्भ कारखाने निर्माता (org.apache.aries.jndi.JREInitialContextFactoryBuilder) का कार्यान्वयन प्रदान किया है जो काम करता है। हालांकि, इसके लिए काम करने के लिए, मुझे मेष कोड बदलना पड़ा जो जेवीएम व्यापक प्रारंभिक संदर्भ कारखाने निर्माता को पंजीकृत करता है। इसे प्राप्त करने का एक और (और संभवतः बेहतर) तरीका हो सकता है। लेकिन यह काम करने लग रहा था।

साथ ही, ध्यान दें कि समस्या InitialMonteager में सेट InitialContextFactoryBuilder पर नहीं रुकती है। ऑब्जेक्ट फैक्ट्रीबिल्डर (जो फिर से नामकरण प्रबंधक में जेवीएम चौड़ा है) के लिए एक ही समस्या उत्पन्न होती है। जेएनडीआई प्रदाता के आधार पर आप कनेक्ट करने का प्रयास कर रहे हैं, आपको मेष जेएनडीआई कोड के उस हिस्से को भी बदलने की आवश्यकता हो सकती है। जैसे टिब्को ईएमएस जेएनडीआई कनेक्शन के लिए, मुझे एक तिब्को विशिष्ट ऑब्जेक्ट फैक्ट्री लौटने के लिए मेष से ओएसजीओब्जेक्ट फैक्ट्रीबिल्डर के लिए कोड को ट्विक करना पड़ा। Context.OBJECT_FACTORIES पर्यावरण मान का उपयोग करके इसे आसानी से सामान्यीकृत किया जा सकता है।

मैंने इसके लिए एक जेरा उठाया है - https://issues.apache.org/jira/browse/ARIES-1127