2009-12-04 10 views
8

में सेवा संदर्भ एक बार जब ओएसजीआई सेवा का उदाहरण बंडल संदर्भ से पुनर्प्राप्त किया जाता है तो सेवा बंद होने पर यह अमान्य हो जाती है?ओएसजीआई

मेरे शुरुआती परीक्षणों से पता चलता है कि सर्विस बंडल बंद होने के बाद भी सेवा का उपयोग किया जा सकता है, जो ओएसजीआई की गतिशील प्रकृति की मेरी समझ के विपरीत है।

मुझे लगता है कि ओएसजीआई कंटेनर में एक और बंडल से एक सेवा (सर्विसट्रैकर के माध्यम से) को पुनर्प्राप्त करने के लिए यह उबाल जाता है, क्या यह एक नया उदाहरण बनाता है या यह आपको कंटेनर में पंजीकृत उदाहरण के लिए सूचक देता है ?

सेवा बंद होने के बाद सेवा उदाहरण का उपयोग करने में कोई खतरा है?

उत्तर

5

यह एक बहुत अच्छा सवाल है इसलिए मैंने एक निश्चित उत्तर की खोज में विनिर्देश में खोद दिया। यह पता चला है कि इस समस्या के बारे में बात करने वाला एक पूरा खंड है - अनुभाग 5.4 स्टेटल संदर्भOSGi Service Platform Core Specification, Release 4, Version 4.2 के पृष्ठ 132 से शुरू हो रहा है।

विवरणों के आधार पर आपके प्रश्न का उत्तर करने के लिए:

एक सेवा के व्यवहार कि अपंजीकृत हो जाता है अनिर्धारित रहता है। ऐसी सेवाएं ठीक से काम करना जारी रख सकती हैं या अपने विवेकानुसार अपवाद फेंक सकती हैं।

और रोकने के लिए संभावित समस्याओं:

बंडल फ्रेमवर्क को साफ और बासी संदर्भ हटाने के लिए द्वारा उत्पन्न की घटनाओं को सुनने चाहिए।

विनिर्देश कुछ सुझाव देता है कि कैसे बालों के संदर्भों के परिणामों को कम किया जाए।

+0

धन्यवाद, दुर्भाग्य से एक निश्चित नहीं हाँ या के रूप में मैं आशा व्यक्त की थी नहीं! –

2

आप सही हैं कि यह ओएसजीआई की गतिशील प्रकृति के विरोधाभासी है। मेरा मानना ​​है कि इस बात की कोई गारंटी नहीं है कि सेवा उपलब्ध होगी, हालांकि ओएसजीआई कंटेनर और सेवाओं के विभिन्न कार्यान्वयन अलग-अलग व्यवहार कर सकते हैं।

उदाहरण के लिए, यदि सेवा स्प्रिंग डीएम के साथ बनाई गई और पंजीकृत की गई थी, तो सेवा को वास्तव में अंतर्निहित कार्यान्वयन के लिए वसंत आधारित प्रॉक्सी है, और कार्यान्वयन अभी भी गायब हो सकता है। इस प्रकार एक सेवा संदर्भ जो सीधे कार्यान्वयन को संदर्भित करता है, उस वस्तु को हटाए जाने से रोक सकता है, जबकि प्रॉक्सी आधारित संदर्भ नहीं होगा।

1

OSGi विनिर्देश का कहना है:

बंडल संस्थाओं कि सामान्य अनुप्रयोग प्रोग्रामिंग में दिखाई दे रहे हैं कर रहे हैं। उदाहरण के लिए, जब एक बंडल बंद हो जाता है, तो सभी इसकी सेवाओं को अनियंत्रित किया जाएगा।

तो आपको एक बंद बंडल से सेवा प्राप्त करने में सक्षम नहीं होना चाहिए। लेकिन तकनीकी रूप से इसका उपयोग करना संभव हो सकता है, कम से कम जब तक आप सेवा ऑब्जेक्ट का संदर्भ रखते हैं (कोई भी इसे आपसे दूर नहीं ले सकता है और यह जीसीडी नहीं होगा)। लेकिन मुझे नहीं लगता कि यह सेवा का उपयोग करने के लिए बचाया गया है। यह अन्य बंडल संसाधनों पर निर्भर हो सकता है, जो बंडल बंद होने के बाद उपलब्ध नहीं हैं।

0

आपके प्रश्न के संबंध में कि सेवा बंद होने के बाद सेवा उदाहरण का उपयोग करना खतरनाक है या नहीं। 4.2 कोर कल्पना (5.4 बासी संदर्भ) से अदालत में तलब करने के लिए:

एक सेवा है जो हो जाता है अपंजीकृत अपरिभाषित है के व्यवहार। ऐसी सेवाएं ठीक से काम कर सकती हैं या अपने विवेकानुसार अपवाद फेंक दें।

मैं यहाँ कल्पना की पूरी अनुभाग का हवाला देते हैं करने के लिए चाहते हैं, लेकिन अगले वाक्य बासी संदर्भों का उपयोग के खतरे के बारे में एक अच्छा विचार-विमर्श कर रहे हैं:

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

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

1

एक OSGi सेवा का एक उदाहरण एक बार बंडल संदर्भ से लिया गया है है यह अवैध हो जाते हैं जब सेवा बंद कर दिया है?

नहीं, संदर्भ स्वयं ही अमान्य नहीं होता है। जब तक कंटेनर में कुछ ऐसा हो रहा है, तब तक यह जीसी'एड भी नहीं हो सकता है।

हालांकि, यह अभी भी उपयोगी होगा या नहीं, केवल सेवा कार्यान्वयन पर ही निर्भर करता है, न कि कंटेनर।

मेरे शुरुआती परीक्षण बताते हैं कि सेवा उदाहरण का उपयोग सेवा बंडल के बाद भी किया जा सकता है> रोक दिया गया है, जो ओएसजीआई की गतिशील प्रकृति की मेरी समझ के विपरीत है।

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

मैं यह है कि क्या OSGi कंटेनर में एक और बंडल से एक सेवा को पुन: प्राप्त (ServiceTracker के माध्यम से) वास्तव में है, यह एक नया उदाहरण पैदा नहीं करता करने पर निर्भर करता है या यह आप उदाहरण है कि करने के लिए एक सूचक देता है लगता है कंटेनर में पंजीकृत है?

कंटेनर सेवा के नए उदाहरण नहीं बनाता है, सिवाय इसके कि कोई सर्विसफैक्टरी शामिल है (चश्मा देखें)। एक सेवा की तलाश में हमेशा आपको कंटेनर में पंजीकृत उदाहरण के लिए एक सूचक होना चाहिए।

सेवा बंद होने के बाद सेवा उदाहरण का उपयोग करने में कोई खतरा है?

यह केवल सेवा कार्यान्वयन पर निर्भर करता है; हालांकि, एक बंडल में ऐसा करके, आप स्वचालित रूप से एक बंडल बनाते हैं जो चश्मा के अनुरूप नहीं है।

प्रैक्टिस में, संसाधनों और संदर्भों को जारी करने के लिए कई सेवाएं लागू की जाती हैं और अब ठीक से प्रतिक्रिया नहीं देगी।

0

एक सेवा संदर्भ को संदर्भ के रूप में कभी नहीं रखा जाना चाहिए। आपको रनटाइम पर हमेशा एक सेवा देखना चाहिए। यह आपको ओएसजीआई एपीआई से जोड़ता है, हालांकि, हमेशा नहीं चाहता था। OSGi serviceTracker - - OSGi कथात्मक सेवाओं - OSGi खाका - स्प्रिंग डीएम - Peaberry - iPojo

जो सभी के लिए गतिशीलता की देखभाल, उनमें से ज्यादातर के साथ कोई

पर एक नज़र उपयोग करने के लिए ओएसजीआई एपीआई।

सादर,

Leen Toelen जवाब के लिए