OSGI服务参考

时间:2014-06-14 21:19:49

标签: osgi osgi-bundle

在我从另一个捆绑服务中调用服务之前,我想搜索此服务可用性,因为我将获得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);
            }

如果找不到服务,我想关闭框架。这样做有什么用?我能以某种方式改进上面的例子吗?

2 个答案:

答案 0 :(得分:3)

这不像OSGi那么容易。由于包含服务的捆绑包可以在使用该服务的捆绑包之后启动,因此您应考虑该动态。只需检查服务是否存在于单个时间点就不够好了。

您可以使用ServiceTracker实现此目的。如果添加了服务,则初始化依赖于它的自己的类。如果它下降你停止它。如果您有多个服务依赖项,那么这非常复杂。

因此,在更大的情况下,最好使用像Declarative Services或蓝图这样的框架,为您自动执行此操作。

答案 1 :(得分:2)

作为Christian的答案的补充,请注意,仅仅因为服务不可用而关闭框架是不好的做法。 OSGi在设计上是动态的,这意味着服务可能来来往往,因此您的捆绑应该能够处理服务尚未(尚未)可用或消失并重新出现的情况。否则,我真的没有看到首先使用OSGi的目的。