2012-06-22 15 views

उत्तर

17

मान लें कि आप गुणों के लिए कुछ मूल्यों के आधार पर पंजीकृत सेवाओं को पुनर्प्राप्त करना चाहते हैं, तो आपको फ़िल्टर (जो LDAP वाक्यविन्यास पर आधारित है) का उपयोग करने की आवश्यकता है।

उदाहरण के लिए:

int myport = 5000; 
String filter = "&(objectClass=" + MyInterface.class.getName() 
       + ")(port=" + myport + ")"; 
ServiceReference[] serviceReferences = bundleContext.getServiceReferences(null,filter); 

, जहां आप सेवाएं दोनों MyInterface लागू करने और port संपत्ति myport के बराबर का मान रखने के लिए देखने के लिए चाहते हैं।

Here संदर्भ प्राप्त करने के लिए प्रासंगिक जावाडोक है।

टिप्पणी 1:

ऊपर के उदाहरण और जावाडोक रिलीज 4.2 का संदर्भ लें। यदि आप जे 2 एसई 1.4 रनटाइम तक सीमित नहीं हैं, तो मेरा सुझाव है कि आप रिलीज 4.3 syntax पर एक नज़र डालें, जहां आप जेनिक्स का उपयोग कर सकते हैं।

टिप्पणी 2: (रे के सौजन्य से)

आप भी अपने फिल्टर की सत्यता की बजाय एक filterStr स्ट्रिंग से एक Filter वस्तु बनाने के द्वारा पूर्व की जाँच कर सकते हैं:

Filter filter = bundleContext.createFilter(filterStr); 

जो भी अनुमति देता है आप फ़िल्टर को अन्य मानदंडों से मेल खाते हैं। संदर्भ प्राप्त करने के लिए आप अभी भी filterStr पास करते हैं, क्योंकि Filter तर्क के लिए कोई ओवरलोडिंग नहीं है। कृपया ध्यान रखें, इस तरह, इस तरह आप दो बार शुद्धता की जांच करेंगे: getServiceReferences और createFilter फ़िल्टर को पार्स करने पर InvalidSyntaxException फेंक दें। निश्चित रूप से एक शो-स्टॉपर अक्षमता नहीं, मुझे लगता है, लेकिन यह उल्लेखनीय है।

+1

मैं सिर्फ जोड़ना होगा कि यह फ़िल्टर फिल्टर = bundleContext.createFilter (filterStr) का उपयोग कर फिल्टर वाक्य रचना को मान्य करने के लिए अच्छा हो सकता है; सबसे पहले, केवल प्रारंभिक सैनिटी जांच के लिए, विशेष रूप से आपके फ़िल्टर निर्माण को और अधिक गतिशील हो जाता है। – Ray

+0

@ रे: बनाने के लिए एक अच्छी टिप्पणी। यह दुर्भाग्यपूर्ण है कि ओएसजीआई फ़िल्टर को पास करने के लिए मजबूर नहीं करता है (या यहां तक ​​कि अनुमति भी देता है)। –

+0

@LucaGeretti घोषणात्मक ओएसजीआई सेवाओं को खोजने का कोई और स्मार्ट तरीका है? –

7

ऊपर लुका का उत्तर सही है, हालांकि यह मानता है कि आप सेवाओं तक पहुंच के लिए निम्न स्तर API का उपयोग कर रहे हैं।

यदि आप घोषणात्मक सेवाओं का उपयोग कर रहे हैं (जो मैं आमतौर पर अनुशंसा करता हूं) तो फ़िल्टर को सेवा संदर्भ के target विशेषता में जोड़ा जा सकता है। उदाहरण के लिए (डी एस के लिए bnd एनोटेशन का उपयोग):

@Reference(target = "(port=8080)") 
public void setHttpService(HttpService http) { 
    // ... 
} 
+0

मैं वास्तव में चाहता हूं कि डीएस (+ एनोटेशन) का उपयोग करने पर एक संपूर्ण ट्यूटोरियल था। नील, क्या आप एक के बारे में जानते हैं (भले ही यह खरीद के लिए है)? मान लीजिए 4.2 (4.3 सबसे अधिक)। – Ray

+0

@ रे: जहां तक ​​किताबें जाती हैं, कोई भी मानक पर नहीं होने के कारण बीएनडी एनोटेशन का इलाज करता है। डीएस के लिए मैं "ओएसजीआई और इक्विनोक्स" (आर 4.2, "ओएसजीआई इन गहराई" में कुछ संदर्भों को छोड़कर आर 4.3 के लिए अभी भी कोई पुस्तक नहीं सुझाऊंगा) –

2

खाका में आप संदर्भ या संदर्भ-सूची तत्व पर फिल्टर विशेषता निर्दिष्ट कर सकते हैं। उदाहरण के लिए:

<reference id="sampleRef" 
     interface="org.sample.MyInterface" 
     filter="(port=5000)"/> 
+0

जो काम नहीं करता है, आपको असंतुष्ट आवश्यकता है): --------------------------- सेवा: (और (सेवा = MyInterface) (पोर्ट = 5000)) [कंटेनर- नाम] कंटेनर शुरू करते समय (कक्षा और कंटेनर नाम उचित रूप से बदल गए)। कोई फर्क नहीं पड़ता कि वह त्रुटि क्या कहने की कोशिश कर रही है। अफसोस की बात है कि हम निराशाजनक दस्तावेज फ्यूज सामान का उपयोग कर रहे हैं ... – StripLight

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