如何配置捆绑包在引用捆绑包开始后开始



服务在xml中的第一个捆绑中定义。

在第二个捆绑包中使用相同的接口在XML中定义了参考。

在激活器的第二捆中,我获得了服务参考:

ServiceReference servReference = context.getServiceReference(MyInterface.class.getName());

,除非第二个捆绑包在第二个捆绑中,否则一切都很好。

然后我得到:

org.osgi.framework.BundleException: Activator start error in bundle foo.bar.baz [123].
Caused by: java.lang.NullPointerException: Specified service reference cannot be null.`

一段时间后,第一个捆绑包开始,一切正常。

所以我的问题是如何强制第二捆捆,等待第一个捆绑启动?

在OSGI中,您永远不要等待另一个捆绑包,或者开始或服务出现。特别是在激活器中永远不要等待,因为它会阻止其他捆绑包的启动。

在您的情况下,您需要在MyInterface服务出现的事件中做出反应。

如果您需要使用普通的OSGI API,则为此使用Servicetracker。您可以覆盖AddingService和删除服务方法,并在其中控制需要服务的类的生命周期。因此,当服务出现时,您可以创建类的实例,注入服务,并最终发射一些回调,让班级知道服务在那里。当服务消失时,您会告诉实例关闭。例如,请参见"跟踪服务"。

您可以想象,这对于跟踪单个服务并将其注入类实例很简单,但是一旦涉及到服务和实例,它确实变得很困难。这就是为什么您通常不应该使用普通的OSGI API。

因此,您应该使用依赖关系管理框架,例如声明服务或蓝图,以照顾您的繁重。

最新更新