ServiceTracker和DS合并了吗?

时间:2013-09-12 06:56:47

标签: osgi bundle equinox declarative-services

让我们想象一下存在的捆绑包:

  
      
  • 组件负责监听服务注册表中的所有“设备”服务实例。

  •   
  • 相同的组件需要“适配器工厂”才能使用发现的设备创建“适配器”。

  •   
  • 工厂由另一个工具包拥有。

  •   

我可以通过使用ServiceTracker(Activator + Service Tracker)解决部分问题:激活器实例化ServiceTraker,它可以注册“设备”服务中的所有更改。

但是我无法向这个服务跟踪器注入DS工厂在其他bundle中创建的,因为它将导致两个实例(一个由激活器创建,没有成员///另一个由osgi创建,并且成员变量ok但是无法听取“设备”服务的变化)。

那么......我该如何解决这个问题呢?如何以DS作为班级成员获得服务跟踪器(非常适合我)?

1 个答案:

答案 0 :(得分:1)

使用no Activator,而是使用声明服务'activate(ComponentContext)'方法使用组件或服务(我们将其称为A)。在activate方法中,您可以像平常一样实例化ServiceTracker。

当您在A的activate方法中实例化ServiceTracker时,您还可以将AdapterFactory传递到ServiceTracker中。你可以通过从ComponentContext中取出BundleContext来获取AdapterFactory,或者(甚至更好)使用DS并使其成为A组件的服务引用。

那说:为什么你需要ServiceTracker呢?除非我误解,否则您可以使用DS绑定和取消绑定来接收有关服务可用性的事件。

编辑:使用多基数的绑定/取消绑定行为的一个(OLD)示例:http://blog.tfd.co.uk/2009/11/12/declarative-optional-multiple-references-flaky-in-osgi/

编辑:这两种方法的比较,但没有进行如此多的绑定/取消绑定:http://njbartlett.name/2010/08/05/when-servicetrackers-trump-ds.html

EDIT2:那就是说:我的一般政策是不使用Activator,除非在极少数情况下。使用DS,ipojo等,并使用您使用这些技术定义的组件,以便访问BundleContext以构建更多低级对象,如ServiceTrackers。