【问题标题】:OSGi service trackers not always workingOSGi 服务跟踪器并不总是有效
【发布时间】:2010-07-01 08:24:36
【问题描述】:

大家好。我们在 Eclipse RCP 应用程序中使用 OSGi 服务。为了跟踪它们,我们使用了org.osgi.util.tracker.ServiceTracker 类。应用程序的示例代码如下所示

mailServiceTracker = new ServiceTracker(context, MailService.class.getName(), null);
mailServiceTracker.open();
MailService service = (MailService) mailServiceTracker.getService();

现在我的问题是,当我创建新服务时,getService() 方法经常返回 null。该代码对于应用程序中存在很长时间的服务非常有效,但是每次创建新服务时,我都必须做很多事情,直到最终找到并跟踪该服务。例如,我经常尝试

  • Eclipse 中的“清理...”
  • “刷新”Eclipse 中的所有项目
  • 在命令行重建项目

这些东西有时会有所帮助,有时却无济于事。有没有人有使用这些跟踪器的经验,可以告诉我如何避免这种行为以及如何在创建后立即跟踪服务?

谢谢

【问题讨论】:

    标签: service osgi eclipse-rcp tracker


    【解决方案1】:

    问题是您想要的服务可能尚未创建(尤其是在捆绑激活器中,因为某些捆绑可能尚未启动)。如果您仍想使用服务跟踪器,则需要提供 ServiceTrackerCustomizer,并在服务来来去去时跟踪(抱歉,不是双关语)。

    或者,您可以切换到为您处理此问题的声明式服务。

    【讨论】:

    • 啊,有趣...我会看看这个ServiceTrackerCustomizer 课程。感谢您的回答!
    【解决方案2】:

    使用 ServiceTrackers 并没有什么问题,除了它是一种相当低级的跟踪服务的方式。虽然我同意声明式服务是一种很好的机制,但因为“各种问题”而简单地解雇 ServiceTrackers 听起来像是一个糟糕的建议。

    回到问题。

    创建并打开服务跟踪器后,您就可以访问所有符合您在创建时指定的过滤条件的服务。那里没有延迟。我唯一能想到的是,您的捆绑包以某种方式未正确解析,因此从捆绑包 A 注册的服务对于捆绑包 B 使用 ServiceTracker 根本不可见。要检查这一点,首先找到导出包含服务接口的包的包,然后确保 A 和 B 都实际连接到它。

    稍微解释一下 OSGi 中的更新/刷新机制:

    每当您在 OSGi 中更新某些内容时,都是一个两步过程。

    假设您更新了包含新版本导出包的捆绑包。我们还假设有一些消费者进口它。只要您只更新捆绑包但没有显式刷新连接(哪个导入链接到哪个导出),消费者仍将连接到旧版本的包。一旦您进行了包刷新(您可以在 OSGi 中通过 PackageAdmin 服务执行此操作),您的使用者将再次被解析并连接到新版本。

    这是分离的原因是您可能希望更新多个捆绑包,而不是在每个捆绑包之后“刷新”,而是推迟此类刷新,直到所有捆绑包都更新。

    这很可能就是您所看到的效果。最初你只做一个更新,只有在刷新之后,tracker才会真正看到新版本的服务。

    【讨论】:

    • 嗨,马塞尔,感谢您的回答。我没有检查问题是否仅在跨捆绑包引用服务时出现,但问题总是在一段时间后消失,所以我认为这与捆绑包没有正确解决有关。我进行了一些刷新和重新编译,但一段时间后,跟踪器似乎工作了。我的问题是,我到底要做什么才能让它们发挥作用?为什么它们不能从一开始就发挥作用?
    • 也许你应该记住 ST 是同步的。只要您调用 ST.open(),您就会收到您正在跟踪的所有服务。
    • David,ServiceTrackers 没有任何问题——它们工作得非常好。如果 ServiceTracker 没有看到服务,那只能是因为该服务不存在。我建议您仔细查看实际创建和注册服务的代码。还可以尝试使用 OSGi shell 提供的命令来诊断服务未注册的原因。
    【解决方案3】:

    一点也不轻率,不要使用服务跟踪器。它们似乎使您的生活变得简单,但是它们存在各种各样的问题。我建议您考虑改用声明式服务。从 3.5 开始,Eclipse 中对 DS 的支持非常好。

    您可能想查看这本书和相关的演示文稿,以了解有关为什么使用服务跟踪器是一个坏主意的更多信息。

    http://equinoxosgi.org/

    【讨论】:

    • 您能否更具体地说明“他们有各种各样的问题”是什么意思?我不会直接忽略它们,因为在某些情况下它们比 DS 更容易使用。
    • 在我参考的书中,查看第 6.2.3 节“Service Tracker Summary”。本书展示了一个使用 Service Trackers 的示例,然后将该示例移至 Service Activator Toolkit(来自 Eclipse RT 项目),然后移至声明式服务。作者在解释问题方面做得比在 Stackoverflow 问题中可能要好得多。
    猜你喜欢
    • 2012-06-14
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    • 1970-01-01
    • 1970-01-01
    • 2016-01-21
    • 2015-08-12
    • 1970-01-01
    相关资源
    最近更新 更多