2012-11-17 22 views
5

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

मेरी कक्षा में उत्प्रेरक

IUserService service = new TestUserService(); 
context.registerService(IUserService.class.getName(), service, null); 

में

@Inject 
IUserService service; 

service.getSth(); 

मैंने पढ़ा है कि कथात्मक सेवाओं के माध्यम से बंडलों का उपयोग कर बेहतर तरीका होना चाहिए। तो मेरा कार्यान्वयन बदल गया। मैं अपने सेवा प्रदान करने के लिए अपने बंडल में एक घटक परिभाषा बनाया:

<?xml version="1.0" encoding="UTF-8"?> 
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="usermanagement.test"> 
    <implementation class="usermanagement.test.TestUserService"/> 
    <service> 
     <provide interface="usermanagement.IUserService"/> 
    </service> 
</scr:component> 

तब मैं अपने उत्प्रेरक से सेवा पंजीकरण हटा दिया और एक सेवा उपभोक्ता श्रेणी का निर्माण:

public class UserServiceConsumer { 

    private IUserService service; 

    public synchronized void setQuote(IUserService service) { 
     this.service = service; 
    } 

    public synchronized void unsetQuote(IUserService service) { 
     if (this.service == service) { 
      this.service = null; 
     } 
    } 

} 

और एक अन्य घटक परिभाषा:

<?xml version="1.0" encoding="UTF-8"?> 
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="UserServiceConsumer"> 
    <implementation class="services.UserServiceConsumer"/> 
    <reference bind="setService" cardinality="1..1" interface="usermanagement.IUserService" name="IUserService" policy="static" unbind="unsetService"/> 
</scr:component> 

इन संशोधनों के बाद मेरे serivce का इंजेक्शन अब और काम नहीं करता है। समस्या यह है कि इंजेक्शन सेवा संदर्भ हर बार न्यूल होता है।

क्या किसी को पता है क्यों? क्या मैं कुछ भूल गया था?

बहुत बहुत धन्यवाद!

उत्तर

2

मैं कुछ चीजों का सुझाव दे सकता हूं जो आप डीबग करने के लिए कर सकते हैं।

  1. क्या आपको वास्तव में आपके रनटाइम में एक स्क्रू कार्यान्वयन मिला है? एससीआर (घोषणात्मक सेवाओं के लिए एक और नाम) विषुव कोर में शामिल नहीं है, इसलिए आपको इसे शामिल करने की आवश्यकता होगी। अधिकांश लोग फ़ेलिक्स एससीआर बंडल का उपयोग करते हैं - यह विषुव के शीर्ष पर बहुत खुशी से बैठेगा।

  2. चूंकि घोषणात्मक सेवाएं केवल सेवाओं का उपयोग करती हैं, इसलिए आप एक समय में अपने ऐप का एक आधा बदल सकते हैं, यह पहचानने के लिए कि यह सेवा खपत या पंजीकरण है जो काम नहीं कर रहा है।

  3. आप अपने सेवा पंजीकरण का निरीक्षण करने के लिए विषुव कंसोल का भी उपयोग कर सकते हैं। अपनी बंडल की पहचान करने के लिए 'एसएस' का प्रयोग करें, फिर 'बंडल [नहीं]' यह देखने के लिए कि कौन सी सेवाएं पंजीकृत हैं और उपभोग की जाती हैं। यदि आप फ़ेलिक्स एससीआर का उपयोग कर रहे हैं, तो इक्विनोक्स कंसोल एक्सटेंशन भी हैं, इसलिए आप किसी भी बंडल को पंजीकरण करने का प्रयास करने वाली सभी सेवाओं को देखने के लिए 'स्क्रू लिस्ट' का उपयोग कर सकते हैं (और उनकी स्थिति), और विशेष रूप से अधिक जानकारी के लिए 'स्क्रू जानकारी' सर्विस।

2

मुझे लगता है कि घोषणात्मक सेवाएं आपके यूआई कक्षा में काम नहीं करेगी क्योंकि यह एससीआर द्वारा बनाई जाएगी लेकिन ग्रहण द्वारा नहीं बनाई जाएगी। तो आप जो कोशिश कर सकते हैं वह UI को छोड़ना है क्योंकि यह @Inject के साथ था और केवल डीएस का उपयोग करने के लिए सेवा प्रदान करने वाला बंडल बदलता है।

असल में मैं यूआई पक्ष को बदलने की भी कोशिश नहीं करता। घोषणात्मक सेवाओं की तुलना में @Inject नोटेशन बहुत कम ओवरहेड है।

+0

आप कैसे अनुमान लगाते हैं कि ओपी यूआई कक्षा में सेवा का उपभोग करना चाहता है? – tkotisis

+0

मैं कक्षा के निर्माता पर @ क्रिएटिव एनोटेशन का उपयोग कर अपनी कक्षा का एक उदाहरण बनाने के लिए DI का उपयोग करता हूं। – roschulze

+0

@tkotsis यदि आप एक्लिप्स आरसीपी का उपयोग करते हैं तो आम तौर पर एक जीयूआई –

3

मुझे एक समाधान मिला है।उसके बाद userServiceConsumer और अपने आवेदन में घटक परिभाषा अनावश्यक हैं

Bundle-ActivationPolicy: lazy 

:

मेरी सेवा की मैनिफ़ेस्ट फ़ाइल में मैं निम्न पंक्ति जोड़ लिया है।

मैं अब निम्न कर सकते हैं एक दृश्य के वर्ग में:

public class MyPart { 

    private IUserService uServ; 

    @Inject 
    public MyPart(IUserService uServ) { 
     this.uServ = uServ; 
     if (uServ != null) 
      System.out.println("UserService available"); 
     else 
      System.out.println("UserService == null"); 
    } 

वाया डि मेरी सेवा को देखने के निर्माता में इंजेक्ट किया जाता है। ये मेरे लिए सही है!

+0

बनाने के लिए यदि यह आपकी समस्या हल करता है, तो आपको इसे स्वीकार करना चाहिए। –