【问题标题】:Osgi getService()奥斯吉 getService()
【发布时间】:2010-11-24 11:29:38
【问题描述】:

在我们的项目(Osgi、Spring-Dm、Apache-Felix)中,当 BundleContext.getService() 返回 null 时,我们在生产中遇到了一些问题。 它很少发生,而且不是一开始就发生,所以这不是配置错误的问题。

另一种方法是使用 ServiceTracker 来定位服务,但由于该错误非常罕见,我不确定更改它是否能解决问题。

【问题讨论】:

  • 您是否考虑过将 iPOJO 与 felix 一起使用?它消除了处理较低级别的 Osgi 调用时的大部分麻烦。
  • 其实没有。可能值得研究。

标签: java osgi apache-felix springsource-dm-server


【解决方案1】:

OSGi 规范说方法返回

  • 与引用关联的服务的服务对象
  • 或 null 如果
    • 服务未注册
    • ServiceFactory 返回的服务对象没有实现 注册的类别
    • ServiceFactory 抛出异常

我的第一个猜测是该服务没有注册。

顺便说一句,使用 Spring-DM 应该使大多数对服务注册表的编程访问变得不必要。至少在我们公司,这些调用通常是被禁止的,并且只允许在较低级别的技术代码中使用。

【讨论】:

  • 猜测(并假设它没有注册)可能是某种奇怪的竞争条件或超时。分布式组件系统只有这么多种故障模式。 :-(
  • 如果缺少注册,肯定会发生一些奇怪的事情,因为大多数情况下它都有效。 (这是一个安静的服务器)。无论如何,我会调查我们是否正确使用了 spring-dm。
【解决方案2】:

Uberto,服务还没注册一点也不奇怪。 OSGi 是动态的。服务来来去去。如果您在注册之前尝试访问服务,那么您将获得 null。

当您执行普通的 getService() 时,您有点假设该服务已经存在。如果您需要该服务在那里,您应该做一些涉及等待注册事件的事情。这可以通过 ServiceTracker 完成,但它的级别相当低。正如其他人所指出的,使用 Spring-DM 或声明式服务之类的东西可以让这变得非常简单和健壮。

【讨论】:

    【解决方案3】:

    我可以确认,如果您使用 ServiceTracker,可能会发生争用情况!有时,即使服务已注册,ServiceTracker 也无法捕获服务。 为了解决这个问题,我使用了 waitForService() 而不是 getService()。

    问候 罗兰

    【讨论】:

      【解决方案4】:

      如果 ServiceReference 不为 null 并在 getService(serviceReference) 时获得空指针,则服务实现类未正确初始化。

      确保服务实现类的构造函数是公共的,并且创建对象时没有错误。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-08
        • 1970-01-01
        • 1970-01-01
        • 2016-06-01
        相关资源
        最近更新 更多