【问题标题】:Diff btw ServiceTracker, ServiceReference & ServiceReferences差异 btw ServiceTracker、ServiceReference 和 ServiceReferences
【发布时间】:2013-12-03 09:27:45
【问题描述】:

我是OSGi的新手,已经研究了一段时间。

我想知道 ServiceTracker, ServiceReference & ServiceReferences 在使用上的主要区别和好处。

我使用了ServiceTrackerServiceReference 的示例,如果服务不可用,则两者都返回NULL。但是,如果该服务可用,那么两者都可以正常工作,但我无法观察两者之间的区别。

我在某处读到ServiceTracker 是一种获取服务引用的编程方式。即编写 ServiceTracker 代码来“跟踪”对另一个服务的引用,并在它可用时让你使用它。但在实际实践中我看不到它是如何完成的!

谁能解释一下? 谢谢。

【问题讨论】:

    标签: java service osgi


    【解决方案1】:

    我建议你都不要使用!

    ServiceReference 仅表示 OSGi 服务注册表中的一个条目。您可能的意思是您正在使用像BundleContext.getServiceReference() 这样的API 调用来访问服务。这是使用 OSGi 服务的最低级别,您可能已经注意到它非常复杂,并且它将您的代码与 OSGi API 耦合。

    ServiceTracker 是非常高的级别,它包含较低级别的调用。关键优势在于它会在服务消失时通知您,这非常重要,因为服务是动态的。然而ServiceTracker 仍然是非常低级的,它仍然将您的代码耦合到 OSGi API。

    我强烈建议避免使用最低级别的 API(基于 ServiceReference)和 ServiceTracker,直到您获得更多 OSGi 经验。

    作为替代方案,我建议学习声明式服务。这为您提供了一个基于依赖注入的编程模型,并将您与 OSGi API 分离。它更容易更安全!您可以从这里的教程开始:http://bndtools.org/tutorial.html

    【讨论】:

    • 嗨@Neil,是否可以使用 bndtools 进行 maven?另外,是否可以在构建执行后推迟 .jar 的生成。我的项目要求是最后生成jar并使用maven。
    • 不错的答案+1。顺便说一句,即使只是草稿,您的书也很棒。我从中学到了大部分的 OSGi 知识!
    【解决方案2】:

    我同意 Neil 的说法,但我需要扩展它以回答您的评论: 如果您想使用 Maven 使用声明式服务构建您的项目,您必须使用 maven-bundle-pluginmaven-scr-plugin。前者在后台使用 bnd 而后者处理您的 DS 注释。示例:

            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-bundle-plugin</artifactId>
                <version>2.3.7</version>
                <extensions>true</extensions>
                <configuration>
                    <instructions>
                        <Bundle-Name>${project.name}</Bundle-Name>
                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
                        <Export-Package>${project.artifactId}.api</Export-Package>
                    </instructions>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-scr-plugin</artifactId>
                <version>1.9.0</version>
                <executions>
                    <execution>
                        <id>generate-scr-scrdescriptor</id>
                        <goals>
                            <goal>scr</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
    

    在这个例子中(在build 部分)我指示maven-bundle-plugin 导出我的${project.artifactId}.api 目录中的所有包(这是我的OSGi 项目中的约定)并且maven-scr-plugin 生成xml基于我的 Apache Felix 声明式服务注释的配置。

    我建议您阅读有关 Apache Felix 声明式服务注释及其工作原理的信息,因为从长远来看,它将对您有很大帮助。

    我有一个示例 OSGi 应用程序,你可以看看:here

    【讨论】:

      猜你喜欢
      • 2010-12-17
      • 2017-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-19
      • 1970-01-01
      • 2011-08-10
      • 2011-01-05
      相关资源
      最近更新 更多