2009-12-05 13 views
13

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

A version 1.0 start level 1 
    B version 1.1 start level 2 
    C requires both bundles, start level 3 

ऊपर के उदाहरण में सी हमेशा से एक है, भले ही बी एक उच्च बंडल संस्करण है सेवा हो जाता है। हालांकि, अगर मैं स्टार्ट लेवल स्विच करता हूं, तो बी ए से पहले शुरू होता है, सी बी सेवा को देखता है।

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

प्रारंभ स्तर के अलावा एक सेवा को प्राथमिकता देने का सबसे अच्छा तरीका क्या है?

उत्तर

17

SERVICE_RANKING सेवा संपत्ति का उपयोग करने के लिए ओएसजीआई सेवाओं को प्राथमिकता देने का सबसे अच्छा तरीका। यह संपत्ति properties ऑब्जेक्ट BundleContext.registerService() विधि पर पारित की जा सकती है।

BundleContext.getServiceReference() विधि के प्रलेखन के अनुसार:

यदि एक से अधिक ऐसी सेवाएं मौजूद हैं, सर्वोच्च रैंकिंग (अपने Constants.SERVICE_RANKING संपत्ति में विनिर्दिष्ट है) के साथ सेवा देता है।

यदि रैंकिंग में कोई टाई है, तो सबसे कम सेवा आईडी (जैसा कि इसके कॉन्स्टेंट्स में निर्दिष्ट है। SERVICE_ID प्रॉपर्टी) के साथ सेवा; यही वह सेवा है जो पहले पंजीकृत हुई थी।

1

org.osgi.framework.BundleContext.registerService(String[], Object, Dictionary) में आप Dictionary में मनमानी गुण निर्दिष्ट कर सकते हैं। सेवा खोजने के लिए, आप org.osgi.framework.BundleContext.getServiceReferences(String, String) में फ़िल्टर निर्दिष्ट कर सकते हैं। और यदि यह पर्याप्त नहीं है, तो आप प्राथमिकता मान के लिए org.osgi.framework.ServiceReference.getProperty(String) देख सकते हैं।

2

सेवा एक तीसरी पार्टी पुस्तकालय द्वारा पंजीकृत है पर रैंकिंग है या पंजीकृत गुण आप नियंत्रण नहीं कर सकते हैं। ServiceTracker का उपयोग करके आपको अधिक नियंत्रण मिल जाता है। उदाहरण के लिए, आप ऐसा कुछ कर सकते हैं:

ServiceTracker tracker = new ServiceTracker (bundleContext, serviceClass ,new ServiceTrackerCustomizer() { 

      @Override 
      public Object addingService(ServiceReference srvRef) { 

       boolean criteria = // whatever your criteria is for prioritizing 
         if(criteria) 
          return bundleContext.getService(srvRef); 
         else 
          return null; 
      } 

      @Override 
      public void modifiedService(ServiceReference srvRef, Object arg1) { 


      } 

      @Override 
      public void removedService(ServiceReference srvRef, Object arg1) { 

      } 

     }); 
tracker.open(); 
Object service = tracker.getService(); 
संबंधित मुद्दे