Osgi getService()

时间:2010-11-24 11:29:39

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

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

替代方案可能是使用ServiceTracker来定位服务,但由于错误很少见,我不确定是否更改它会解决问题。

4 个答案:

答案 0 :(得分:2)

OSGi规范说该方法返回

  
      
  • 与参考
  • 关联的服务的服务对象   
  • 或null如果   
        
    • 服务未注册
    •   
    • ServiceFactory返回的服务对象未实现   注册的课程
    •   
    • ServiceFactory引发了异常
    •   
  •   

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

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

答案 1 :(得分:1)

Uberto,对于尚未注册的服务并不奇怪。 OSGi是动态的。服务来来去去。如果您在注册之前尝试访问服务,那么您将获得null。

当您执行普通的getService()时,您可以假设该服务已存在。如果您需要服务,那么您应该做一些涉及等待注册事件的事情。这可以通过ServiceTracker完成,但它的级别相当低。正如其他人所指出的那样,使用像Spring-DM或Declarative Services这样的东西可以使这很容易和健壮。

答案 2 :(得分:0)

如果您使用ServiceTracker,我可以确认会出现竞争条件!有时,即使服务已注册,ServiceTracker也无法捕获服务。 要解决这个问题,我使用waitForService()而不是getService()。

此致 罗兰

答案 3 :(得分:0)

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

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