java - 如何配置 bundle 在引用的 bundle 启动后启动?

标签 java osgi apache-karaf

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

在第二个包中,使用相同的接口(interface)在 xml 中定义引用。

在激活器的第二个包中,我通过以下方式获取服务引用:

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

除非第一个 bundle 在第二个 bundle 之后启动,否则一切都会正常工作。

然后我得到:

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

过了一会儿,第一个 bundle 启动,一切正常。

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

最佳答案

在 OSGi 中,您永远不应该等待另一个包或启动或服务出现。特别是永远不要在 Activator 中等待,因为它会阻止其他 bundle 的启动。

在您的情况下,您需要对 MyInterface 服务出现的事件使用react。

如果您需要使用普通的 OSGi API,那么您可以使用 ServiceTracker。您可以重写addingService 和removedService 方法,并在其中控制需要该服务的类的生命周期。因此,当服务启动时,您创建该类的实例,注入(inject)服务并最终启动一些回调,让该类知道该服务在那里。当服务消失时,您告诉实例关闭。例如,请参阅 "Tracking a service".

正如您可以想象的那样,这对于跟踪单个服务并将其注入(inject)到类实例中很简单,但一旦涉及更多服务和实例,它就会变得非常困难。这就是为什么您通常不应该使用普通的 OSGi API。

因此,您应该使用依赖管理框架(例如声明性服务或蓝图)来为您处理这项繁重的工作。

关于java - 如何配置 bundle 在引用的 bundle 启动后启动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48908193/

相关文章:

eclipse - 如何在 Eclipse 中集成 Karaf

java - 缺少需求 - Org.apache.shiro - Osgi Karaf

java - 我可以在 Java 中使用 "write once run forever"类型的系统吗?

maven - 无法启动 bundle - 缺少要求(osgi.wiring.package)

java - Eclipse:矛盾的警告

java - 如何解决更深版本的jar-hell?

java - 5.0.0 以下版本的 Hibernate Karaf 功能

Java JSSE SSLEngine 无法恢复 SSL session

具有即插即用数据库的 Java 应用程序

java - J2ObjC:将 @Nullable 转换为 __nullable