【问题标题】:How instantiate several OSGi services?如何实例化几个 OSGi 服务?
【发布时间】:2011-04-13 13:33:23
【问题描述】:

在 Eclipse RCP 应用程序的上下文中,我决定使用 OSGi 服务从插件(即包)中提供“接口”。

在我的一个插件中,我有以下解析器接口:

public interface Parser {

    public void start(File file);

    public boolean hasNext();

    public Object next();
}

消费者插件将使用此接口来解析文件。因为可以同时完成多个解析,并且因为此接口的实现将需要多个“状态”私有字段,因此该服务的每个使用者都必须使用专用的服务实例。

在这种情况下,manu OSGi 教程提供的默认解决方案(包括在解析器包的启动方法中注册一个服务实例)不起作用。处理这种解决方案的最佳解决方案是什么? 我可以使用一种独特的方法创建 ParserFactory 服务:

public Parser create(File file);

??

欢迎评论,

【问题讨论】:

    标签: java eclipse osgi equinox


    【解决方案1】:

    正如您所建议的,我会将您的服务接口更改为解析器的提供者。

    你的解析器只是一个迭代器,所以可能是这样的

    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 也使得它比需要文件更灵活。

    【讨论】:

    • 感谢有关 Iterable 的提示。
    【解决方案2】:

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

    【讨论】:

    • 折腾了好久,终于用ServiceFactory研究了解决方案,可惜没有解决这个问题中提到的问题。如果一个独特的 Bundle 想要在给定时间解析多个文件,则此解决方案将不起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-14
    相关资源
    最近更新 更多