Osgi getService()

问题描述 投票:1回答:4

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

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

java osgi apache-felix springsource-dm-server
4个回答
2
投票

OSGi规范说该方法返回

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

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

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


1
投票

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

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


0
投票

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

关心罗兰


0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.