gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:18:32 27 4
gpt4 key购买 nike

服务在 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com