2011-04-13 57 views
1

在Eclipse RCP應用程序的上下文中,我決定使用OSGi服務爲插件(即一個包)提供「接口」。如何實例化幾個OSGi服務?

在我的插件之一,我有以下Parser接口:

public interface Parser { 

    public void start(File file); 

    public boolean hasNext(); 

    public Object next(); 
} 

消費者插件會使用這個接口來解析文件。因爲可以在同一時間完成幾個解析,並且由於此接口的實現需要多個「狀態」專用字段,所以該服務的每個使用者必須使用專用服務實例。

在這種情況下,manu OSGi教程提供的默認解決方案無法在分析器包的start方法中註冊ONE服務實例。處理這種解決方案的最佳解決方案是什麼? 我可以用一個獨特的方法創建一個ParserFactory服務:

public Parser create(File file); 

任何意見是值得歡迎的,

回答

2

正如你所建議的那樣,我會改變你的服務接口來成爲解析​​器的提供者。

而且你的解析器僅僅是一個Iterator,所以也許像

public interface ParserFactory<T> { 

    /** Iterating on the returned object 
    * provides Ts parsed from the InputStream. 
    * 
    * @param input must be closed by the returned object 
    * when done iterating. 
    */ 
    Iterable<T> createParser(InputStream input); 
} 

使用的InputStream或Reader也使得它更加靈活,要求文件。

+0

感謝有關Iterable的提示。 – 2011-08-03 10:10:21

2

看一看OSGi的ServiceFactory;這允許您爲不同的請求包實例化服務。您可以在覈心規範的第5.6節中閱讀更多關於它的內容。

+0

經過很長時間,我最終調查了使用ServiceFactory的解決方案,不幸的是它並沒有解決這個問題中提到的問題。如果一個獨特的Bundle想要在給定的時間解析幾個文件,這個解決方案將不起作用。 – 2011-08-03 10:06:28