2009-12-24 14 views
17

किसी ऐसे व्यक्ति के रूप में सेवा लोडर का उपयोग कब करें, जो निर्भरता के लिए एलर्जी है, जब मैं जावा 6 http://java.sun.com/javase/6/docs/api/java/util/ServiceLoader.html (मैं प्लगइन जार को बस छोड़ना चाहता हूं) के बजाय ओएसजीआई की तरह कुछ उपयोग करता हूं।ओएसजीआई

(एफवाईआई यह एक स्कैला ऐप में है, किसी भी सुझाव के लिए खुला है, सर्विसलोडर जो चाहता है उसके करीब बहुत करीब है)।

उत्तर

14

यदि ServiceLoader अधिकतर आपकी आवश्यकताओं के अनुरूप है, तो यह कहता है कि आप कक्षा पथ पर फ़ाइलों की उपस्थिति के माध्यम से सेवा खोज की तलाश में हैं। ओएसजीआई क्या प्रदान करता है यह केवल एक छोटा सा हिस्सा है।

ओएसजीआई आपको गतिशील रूप से बंडल इंस्टॉल करने, सेवाओं का विज्ञापन करने, विज्ञापनों को निरस्त करने, और एप्लिकेशन चलने के दौरान सभी को अनइंस्टॉल करने देता है। इसके अलावा, सेवाओं के उपभोक्ता के रूप में, आप उन्हें उत्सुकता से देख सकते हैं - फ़िल्टरिंग अनुमानित प्रश्नों के साथ - और जब सेवा प्रदाता आते हैं और जाते हैं तो पता लगाते हैं। इन बंडलों को कक्षा पथ पर झूठ बोलने की आवश्यकता नहीं है, और उन्हें विभिन्न रूपों में प्रदान किया जा सकता है; जार फाइलें और "विस्फोट निर्देशिका" दो याद हैं।

इसके विपरीत, ServiceLoader केवल एक चीज है: यह खोजने योग्य कारखानों का खुलासा करता है। आम तौर पर आप एक फैक्ट्री-शैली इंटरफ़ेस तैयार करेंगे जो यह तय करने के लिए कुछ तर्क लेता है कि वह प्रदाता उपयुक्त सेवा प्रदान कर सकता है, जैसे किसी दिए गए वर्ण सेट नाम को CharsetDecoder पर मैप करना। ऐसे प्रदाता से सेवा प्राप्त करने और जारी करने के लिए कोई औपचारिक प्रोटोकॉल नहीं है। ओएसजीआई सेवाओं के लिए उपभोक्ताओं के बाध्यकारी और बाध्यकारी औपचारिकता करता है। उपभोक्ता अधिसूचना प्राप्त कर सकता है जब नए प्रदाता ऑनलाइन आते हैं, और जब उपभोक्ता एक सेवा उदाहरण प्राप्त करता है और जारी करता है तो प्रदाता अधिसूचना प्राप्त कर सकता है। यदि यह जीवन चक्र नियंत्रण आपकी सेवा के लिए महत्वपूर्ण है और आप ओएसजीआई से गुजरते हैं, तो आपको इसे स्वयं बनाना होगा; ServiceLoader अब तक नहीं जाता है।

वैकल्पिक सेवा लुकअप और उपयोग के बजाय वैकल्पिक रूप से, आप अधिक निष्क्रिय, घोषणात्मक दृष्टिकोण ले सकते हैं और ओएसजीआई निर्भरता प्रबंधकों में से एक को उपलब्ध सेवा प्रदाताओं को आपकी निर्दिष्ट आवश्यकताओं से मेल खाते हैं। से चुनने के लिए कई निर्भरता प्रबंधक हैं। Spring Dynamic Modules सबसे सक्षम है।

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

+0

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

+2

मैं वर्तमान प्रोजेक्ट पर 'सर्विसलोडर' का उपयोग करता हूं, और मुझे मिली केवल निराशाएं 1) कक्षा पथ पर जार फ़ाइलों के रूप में विस्तार को धक्का देने की आवश्यकता के साथ (हमारे अनुप्रयोग कक्षा पथ के साथ अंतिम उपयोगकर्ता को झुकाव नहीं देते हैं) , और 2) अनिर्दिष्ट आदेश जिसके द्वारा एक ही सेवा इंटरफ़ेस के भाई प्रदाता उपभोक्ता के संपर्क में आ जाएंगे। उत्तरार्द्ध में "प्राथमिकता" को शामिल करना मुश्किल हो जाता है, जैसे उपयोगकर्ता द्वारा प्रदान किए गए एक्सटेंशन एप्लिकेशन की मूल सेवाओं के लिए बेहतर होना चाहिए। इसलिए, 'ServiceLoader' का सबसे अच्छा उपयोग किया जाता है जब प्रदाता एक दूसरे के साथ ओवरलैप या प्रतिस्पर्धा नहीं करेंगे। – seh

3

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

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

सर्विसलोडर के साथ ध्यान में रखना एक और बात है जो लुकअप तंत्र को सारणीबद्ध करने का प्रयास करना है। प्रकाशन तंत्र काफी अच्छा और साफ और घोषणात्मक है। लेकिन लुकअप (java.util.ServiceLoader के माध्यम से) नरक के रूप में बदसूरत है, जो क्लासपाथ स्कैनर के रूप में लागू होता है जो कोड को किसी भी पर्यावरण (जैसे ओएसजीआई या जावा ईई) में डाल देता है जिसमें वैश्विक दृश्यता नहीं होती है। यदि आपका कोड उस के साथ उलझ जाता है तो आपको बाद में ओएसजीआई पर इसे चलाने में कठिन समय लगेगा। एक समय सारिणी लिखने के लिए बेहतर है जिसे आप समय के साथ बदल सकते हैं।

+1

क्या आप सर्विसलोडर के लिए एक सरल अमूर्तता पर विस्तार कर सकते हैं जो बाद में ओएसजीआई में माइग्रेट करना आसान बना देगा। मेरे पास वर्तमान में एक ढांचा है जो 12 या 13 जार फ़ाइलों में विभाजित है जो क्लासपाथ पर मॉड्यूल के लिए 'स्कैन' के मूल घटक के लिए serviceloader तंत्र का उपयोग करता है। मैं भविष्य में ओएसजीआई में अच्छी तरह से खेलने के लिए ढांचे की इच्छा करता हूं लेकिन ओएसजीआई पर निर्भर नहीं हूं। अब तक, मैं नहीं देख सकता कि द्वंद्व को कैसे प्राप्त किया जाए। सर्विसलोडर तंत्र का उपयोग करते समय ओएसजीआई के आधा-बाहर और आधा आउट होना भी संभव है? – Chris

+1

सबसे अच्छा अमूर्तता निर्भरता इंजेक्शन की तरह कुछ होगा। आपके कोड में कुछ सेवा "फू" की आवश्यकता है, उस सेवा को देखने का प्रयास न करें, लेकिन इसे केवल setFoo() विधि के माध्यम से इंजेक्शन देने दें। किसी अन्य वर्ग से, Foo का उदाहरण प्राप्त करने के लिए ServiceLoader पर कॉल करें और इसे उस कोड में इंजेक्ट करें जिसकी आवश्यकता है। यदि आप बाद में ओएसजीआई में जाते हैं, तो बस दूसरी कक्षा को स्क्रैप करें और ओएसजीआई सेवाओं के इंजेक्शन को संभालने के लिए घोषणात्मक सेवाएं या ब्लूप्रिंट का उपयोग करें। –