在我从另一个捆绑服务中调用服务之前,我想搜索此服务可用性,因为我将获得NPE。
搜索服务的正确方法是什么?
ServiceReference serviceReference = bc.getServiceReference(someclass.class.getName());
if (serviceReference == null)
{
throw new RuntimeException("Missing service someclass, please start bundle <name>");
}
else
{
kernelsManager = (someclass) bc.getService(serviceReference);
}
如果找不到服务,我想关闭框架。这样做有什么用?我能以某种方式改进上面的例子吗?
答案 0 :(得分:3)
这不像OSGi那么容易。由于包含服务的捆绑包可以在使用该服务的捆绑包之后启动,因此您应考虑该动态。只需检查服务是否存在于单个时间点就不够好了。
您可以使用ServiceTracker实现此目的。如果添加了服务,则初始化依赖于它的自己的类。如果它下降你停止它。如果您有多个服务依赖项,那么这非常复杂。
因此,在更大的情况下,最好使用像Declarative Services或蓝图这样的框架,为您自动执行此操作。
答案 1 :(得分:2)
作为Christian的答案的补充,请注意,仅仅因为服务不可用而关闭框架是不好的做法。 OSGi在设计上是动态的,这意味着服务可能来来往往,因此您的捆绑应该能够处理服务尚未(尚未)可用或消失并重新出现的情况。否则,我真的没有看到首先使用OSGi的目的。