OSGI服务参考

OSGI服务参考,osgi,osgi-bundle,Osgi,Osgi Bundle,在我从另一个捆绑包调用服务之前,我想搜索此服务的可用性,因为我将获得NPE 搜索服务的正确方式是什么 ServiceReference serviceReference = bc.getServiceReference(someclass.class.getName()); if (serviceReference == null) { throw new RuntimeException("Missing serv

在我从另一个捆绑包调用服务之前,我想搜索此服务的可用性,因为我将获得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);
            }
ServiceReference-ServiceReference=bc.getServiceReference(someclass.class.getName());
if(serviceReference==null)
{
抛出新的RuntimeException(“缺少服务someclass,请启动bundle”);
}
其他的
{
kernelsManager=(someclass)bc.getService(serviceReference);
}

如果找不到服务,我想关闭框架。这样做的正确方法是什么?我能改进一下上面的例子吗?

这并不像OSGi中那样简单。由于包含服务的捆绑包可以在使用该服务的捆绑包之后启动,因此您应该考虑该动态。简单地检查服务是否在单个时间点存在是不够的

您可以通过使用ServiceTracker来实现这一点。如果添加了服务,则初始化依赖于该服务的类。如果它掉下去,你就停下来。如果您有多个服务依赖项,那么这是相当复杂的


因此,在更大的情况下,最好使用声明性服务或蓝图之类的框架来为您实现自动化。

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

您可以通过使用ServiceTracker来实现这一点。如果添加了服务,则初始化依赖于该服务的类。如果它掉下去,你就停下来。如果您有多个服务依赖项,那么这是相当复杂的


因此,在更大的情况下,最好使用声明性服务或蓝图之类的框架来为您实现自动化。

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

作为Christian回答的补充,请注意,仅仅因为服务不可用而关闭框架是不好的做法。OSGi在设计上是动态的,这意味着服务可以来去自如,因此您的捆绑包应该能够处理服务(尚未)可用或消失并重新出现的情况。否则,我真的不明白使用OSGi的初衷。

还有一个问题。如果服务不可用,我如何停止捆绑包?这仍然不是一个好的做法,您应该通过声明性服务或
ServiceTracker
跟踪服务,但是您可以使用
bundle.stop
停止捆绑包。如果您使用声明性服务,则依赖于外部服务的类将在可用时启动,并在服务消失时停止。Blueprint没有那么动态,但仍然可以处理来来往往的服务。作为Christian评论的补充:您肯定应该避免使用
ServiceTracker
之类的工具,让依赖注入框架为您完成工作。您可以从DeclareTVice服务、Blueprint或iPOJO中进行选择。我个人最喜欢的是iPOJO,因为它比声明式服务强大得多,但不像Blueprint那样试图隐藏动态性。还有一个问题。如果服务不可用,我如何停止捆绑包?这仍然不是一个好的做法,您应该通过声明性服务或
ServiceTracker
跟踪服务,但是您可以使用
bundle.stop
停止捆绑包。如果您使用声明性服务,则依赖于外部服务的类将在可用时启动,并在服务消失时停止。Blueprint没有那么动态,但仍然可以处理来来往往的服务。作为Christian评论的补充:您肯定应该避免使用
ServiceTracker
之类的工具,让依赖注入框架为您完成工作。您可以从DeclareTVice服务、Blueprint或iPOJO中进行选择。我个人最喜欢的是iPOJO,因为它比声明式服务强大得多,但不像Blueprint那样试图隐藏动态。