2010-04-08 12 views
0

在我的一個實現庫中,我想知道哪些用戶庫請求來自哪個用戶?如何獲得使用我的導出包之一的Osgi包的符號名稱?

捆綁 ClientCode - > serviceInterface等

捆B ClientCode - > serviceInterface等

捆綁Ç serviceInterface等 ServiceImpl。

這些接口由impl中的一個來解決。捆綁(捆綁C)。在這個包裏面,我想知道哪個bundle請求來自(A或B)?

謝謝。

+0

你能有點更specifc?標題是關於包裹,關於服務的文字。你想知道誰在使用(即導入)導出的軟件包,或者誰在調用你的軟件包中註冊的服務? – akr 2010-04-21 13:14:55

回答

2

您可以將BundleContext的參數添加到您的接口方法中。然後,當客戶端代碼調用您的服務時,傳遞其捆綁上下文,您可以調用context.getBundle().getSymbolicName()或其他方法來獲取有關調用來自的包的信息。

1

正確的做法是使用ServiceFactory,如OSGi規範中所述。如果將服務註冊爲服務工廠,則可以爲每個「客戶端」(其中「客戶端」定義爲捆綁包,調用服務)提供實現。這可以讓你知道誰在調用你,而不需要客戶端指定任何東西,因爲它顯然不是好的設計來添加一個名爲BundleContext的參數(除非沒有別的辦法)。

一些 「僞」 代碼:

class Bundle_C_Activator implements BundleActivator { 
    public void start(BundleContext c) { 
    c.registerService(ServiceInterface.class.getName(), 
     new ServiceFactory() { 
     Object getService(Bundle b, ServiceRegistration r) { 
      return new ServiceImpl(b); // <- here you hold on to the invoking bundle 
     } 
     public void ungetService(Bundle b, ServiceRegistration r, Object s) {} 
     }, null); 
    } 
} 

class ServiceImpl implements ServiceInterface { 
    ServiceImpl(Bundle b) { 
    this.b = b; // <- so we know who is invoking us later 
    } 
    // proceed here with the implementation... 
} 
相關問題