我有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 ..)?
答案 0 :(得分:2)
使用服务的每个捆绑包都需要自己的ServiceTracker。 ServiceTracker将使用bundle的上下文来查找和绑定服务。您不希望使用另一个捆绑包的上下文来跟踪捆绑包的服务,因为很多东西都无法正常工作,例如Service Hooks,因为所有服务似乎都被其上下文用于ServiceTracker的捆绑包使用。
更好的是,根本不使用ServiceTrackers。使用声明式服务!
答案 1 :(得分:0)
它是包含ServiceTracker的bundle的BundleContext。所以在你的情况下,捆绑A。
答案 2 :(得分:0)
您可以实现一个服务组件,该组件侦听具有特定接口(您的要求)的其他服务何时来去(动态服务引用)。您可以在acs example project中找到一个可能的示例实现。