OSGi - 我应该为每个捆绑包创建服务跟踪器吗?

时间:2015-05-29 18:43:38

标签: java osgi apache-felix

我有10个捆绑(A,B,C ..)。在捆绑A中,我想创建服务跟踪器来跟踪那些实现某些接口的服务。这些osgi服务可以在任何包(A,B,C ..)中。我以为我应该创建一个服务跟踪器并启动它。然而,令我困惑的是,将bundleContext的引用传递给构造函数(什么bundle?)

是必要的。
 public class MyServiceTracker extends ServiceTracker{
 public MyServiceTracker(BundleContext context){
        super(context, SomeInterface.class.getName(), null);
        open();
    }
  ....
 }

在javadoc中它说(关于构造函数)

  

context - 跟踪完成的BundleContext。

问题 - 我为什么要传递bundleContext,我应该传递什么bundleContext,还是应该为每个包创建跟踪器实例(A,B,C ..)?

3 个答案:

答案 0 :(得分:2)

使用服务的每个捆绑包都需要自己的ServiceTracker。 ServiceTracker将使用bundle的上下文来查找和绑定服务。您不希望使用另一个捆绑包的上下文来跟踪捆绑包的服务,因为很多东西都无法正常工作,例如Service Hooks,因为所有服务似乎都被其上下文用于ServiceTracker的捆绑包使用。

更好的是,根本不使用ServiceTrackers。使用声明式服务!

答案 1 :(得分:0)

它是包含ServiceTracker的bundle的BundleContext。所以在你的情况下,捆绑A。

答案 2 :(得分:0)

您可以实现一个服务组件,该组件侦听具有特定接口(您的要求)的其他服务何时来去(动态服务引用)。您可以在acs example project中找到一个可能的示例实现。