Osgi ServiceTracker和DS的组合?

Osgi ServiceTracker和DS的组合?,osgi,bundle,equinox,declarative-services,Osgi,Bundle,Equinox,Declarative Services,让我们想象一个包,其中存在: 组件负责侦听服务注册表中的所有“设备”服务实例 同一组件需要“适配器工厂”,以便使用发现的设备创建“适配器” 这家工厂归另一家公司所有 我可以通过使用ServiceTracker(Activator+Service Tracker)解决部分问题:Activator实例化ServiceTracker,并可以注册“设备”服务中的所有更改 但是我不能将在其他捆绑包中创建的DS工厂注入到这个服务跟踪器中,因为它将导致两个实例(一个是由activator创建的,没有

让我们想象一个包,其中存在:

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

  • 同一组件需要“适配器工厂”,以便使用发现的设备创建“适配器”

  • 这家工厂归另一家公司所有

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

但是我不能将在其他捆绑包中创建的DS工厂注入到这个服务跟踪器中,因为它将导致两个实例(一个是由activator创建的,没有成员///另一个是由osgi创建的,带有成员变量ok,但无法侦听“设备”服务更改)


所以。。。我如何解决这个问题?我怎样才能拥有一个以DS作为类成员的服务跟踪器(非常适合我)?

不要使用Activator,而是使用一个组件或服务(我们称之为a)和一个声明性服务的“activate(ComponentContext)”方法。在activate方法中,您可以像普通方法一样实例化ServiceTracker

在的activate方法中实例化ServiceTracker时,还可以将AdapterFactory传入ServiceTracker。您可以将AdapterFactory从ComponentContext获取的BundleContext中取出,或者(甚至更好)使用DS并将其作为对您的a组件的服务引用,从而获得AdapterFactory

也就是说:为什么您需要ServiceTracker来完成此任务?除非我有误解,否则您可以使用DS bind和unbind来接收有关服务可用性的事件

编辑:使用多基数绑定/取消绑定行为的(旧)示例:

编辑:两种方法的比较,但不太涉及绑定/取消绑定:


EDIT2:也就是说:我的一般政策是除非在极少数情况下,否则不要使用激活剂。使用DS、ipojo等,并使用这些技术定义的组件来访问BundleContext,以构建更多的低级对象,如ServiceTracker。

谢谢Sheena,我做了相反的事情。我的意思是,在服务跟踪器中恢复工厂(我已经获得了上下文)。无论如何,我知道具有多基数的DS是服务跟踪器的替代品。。。我说得对吗?我没有看到任何例子解释如何使用DS替换服务跟踪器。。。你能给我指一个有用的吗?是的,你当然可以这样做,它应该工作得很好。如果没有代码示例,很难说发生了什么。是的,这是一个替代品,但不是100%。ServiceTracker仍然很有用,可以与DS一起使用。我已经用一些博客文章的例子更新了我的答案。我希望一切进展顺利。=)如果你还有什么想法,我很想听听。(注:我不参与OSGI小组,所以我对这些想法无能为力,但我希望最终能发布一些关于这项技术的软件和文档,并喜欢听人们说些什么。)嗯。。。我正在尝试将代码移植到完全DS模式。所以,我有一个捆绑包,它通过工厂“启动”组件,我正试图在另一个捆绑包中跟踪这些组件。到目前为止,很好,我可以在创建新组件后立即“侦听”它们,但在原始工厂中杀死组件时,从未调用unbind方法。有什么想法吗?这个问题和红衣主教有关吗?算了吧,这是我愚蠢的过错:)希望很快听到你的项目。当做