如何实例化几个OSGi服务?

时间:2011-04-13 13:33:23

标签: java eclipse osgi equinox

在Eclipse RCP应用程序的上下文中,我决定使用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 个答案:

答案 0 :(得分:2)

看看OSGi ServiceFactory;这允许您为不同的请求包实例化服务。您可以在核心规范的5.6节中阅读更多相关信息。

答案 1 :(得分:2)

正如您所建议的那样,我会将您的服务界面更改为Parsers的提供商。

你的Parser只是一个迭代器,所以也许像

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也使其更加灵活,需要文件。