【问题标题】:ServiceTracker and DS combined?ServiceTracker 和 DS 相结合?
【发布时间】:2013-09-12 06:56:46
【问题描述】:

让我们想象一个存在于其中的捆绑包:

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

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

  • 工厂由另一个捆绑包拥有。

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

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

那么...我该如何解决这种情况?作为班级成员,我怎样才能拥有一个服务跟踪器(对我来说是完美的)?

【问题讨论】:

    标签: osgi bundle equinox declarative-services


    【解决方案1】:

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

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

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

    编辑:使用多个基数的绑定/取消绑定行为的(旧)示例: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:也就是说:我的一般政策是不使用激活器,除非在极少数情况下。使用 DS、ipojo 等,并使用您通过这些技术定义的组件,以便访问 BundleContext 以构建更底层的对象,例如 ServiceTrackers。

    【讨论】:

    • 谢谢希娜,我做了相反的事情。我的意思是,在服务跟踪器中恢复工厂(我有上下文)。无论如何,我知道具有多个基数的 DS 可以替代服务跟踪器……我说的对吗?我还没有看到任何解释如何使用 DS 替换服务跟踪器的示例...你能指出一个有用的吗?
    • 是的,您当然可以这样做,而且应该可以正常工作。如果没有代码示例,很难说到底发生了什么。是的,它是替代品,但不是 100%。 ServiceTracker 仍然很有用,可以与 DS 一起使用。我已经用一些博客文章示例更新了我的答案。
    • 我希望一切顺利。 =) 如果您有任何其他想法,我很想听听。 (p.s.:我没有参与 OSGI 小组,所以我对这些想法无能为力,但我希望最终发布一些关于该技术的软件和文档,并想听听人们怎么说)。
    • 嗯...我正在尝试将我的代码移植到完整的 DS 模式。所以,我有一个与工厂“启动”组件的捆绑包,我正在尝试在另一个捆绑包中跟踪这些组件。到目前为止一切顺利,我可以在创建新组件后立即“监听”它们,但是当我在原始工厂中杀死组件时,从未调用 unbind 方法。有任何想法吗?这个问题与基数有关吗?
    • 算了,这是我愚蠢的错 :) 希望很快能听到你的项目。问候
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-12
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多