代码之家  ›  专栏  ›  技术社区  ›  David Sauter

OSGi服务跟踪器不总是工作

  •  0
  • David Sauter  · 技术社区  · 15 年前

    嘿,伙计们。我们在eclipsercp应用程序中使用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中的所有项目
    • 在命令行上重建项目

    谢谢

    3 回复  |  直到 15 年前
        1
  •  2
  •   Tassos Bassoukos    15 年前

    问题是您想要的服务可能尚未创建(特别是在bundle activator中,因为有些bundle可能尚未启动)。如果您仍然想使用服务跟踪器,您将需要提供一个ServiceTrackerCustomizer,并在服务来来去去时跟踪(抱歉,没有双关语)。

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

        2
  •  1
  •   Marcel Offermans    15 年前

    使用ServiceTrackers没有什么错,只是它是一种相当低级的服务跟踪方式。虽然我同意声明式服务是一种很好的机制,但仅仅因为“各种各样的问题”而拒绝ServiceTracker听起来像是一个糟糕的建议。

    回到问题上来。

    进一步解释OSGi中的更新/刷新机制:

    无论何时更新OSGi中的内容,都需要两个步骤。

    假设您更新了一个包含导出包的新版本的包。让我们也假设有一些消费者进口它。只要您只更新bundle,而不显式地刷新连接(导入链接到导出),消费者仍然会连接到包的旧版本。一旦你做了一个包刷新(你可以通过PackageAdmin服务在OSGi中做的事情),你的消费者将再次被解析,并连接到新版本。

    这是解耦的原因是,您可能希望对多个bundle进行更新,而不是在每个bundle之后“刷新”,而是将这样的刷新推迟到所有bundle都更新之后。

        3
  •  0
  •   James Branigan    15 年前

    不要轻率,不要使用服务跟踪器。他们似乎使你的生活简单,但也有各种各样的问题。我建议您考虑改用声明式服务。从3.5版开始,Eclipse对DS的支持就非常好。

    http://equinoxosgi.org/