gpt4 book ai didi

java - OSGI:声明性服务在捆绑启动后可用

转载 作者:行者123 更新时间:2023-12-02 03:26:25 25 4
gpt4 key购买 nike

问题很简单,但我找不到答案 - 我可以声明 bundle A 中的所有声明性服务在 bundle A 启动后都可用吗?例如,

bundle=context.installBundle("file:bundleA-1.0.0.jar");
bundle.start();
//In this point are declarative services of bundle A 100% available?

附注我使用apache felix,但我认为它必须在规范中定义,而不是在实现中定义。

编辑:
我假设 DS 运行时正在运行,配置存在并且所有强制引用都存在。

最佳答案

你的问题的答案很简单:不。无论是基于时间还是顺序,都无法保证 OSGi 中的可用性。唯一的保证在服务事件中指定。

在代码中做出时序/顺序假设是造成复杂性的最大原因之一,因为它们总是以最模糊的方式被违反。

DS 使得编写能够在服务依赖项出现和消失时对其做出正确 react 的代码变得非常简单。确保获得与服务相关的保证非常复杂,如果您开始假设调用方法后某些东西应该可用,那么您就会破坏所有这些值(value)。

在您的示例中,只需依赖您需要的服务。如果该服务可用,那么您确定所有初始化都已完成。

如果您坚持服务依赖关系,OSGi 中的生活将相当简单且非常健壮。

更新了问题后的示例

非 OSGi 端:

 systemBundleContext = ... create framework
systemBundleContext.registerService(
BundleActivator.class,
new BundleActivator() {
public void start(BundleContext c) {
// start non-OSGi code
}
public void stop(BundleContext c) {
// stop non-OSGi code
}
},
null );

DS 组件:

 @Component
public class Initiator {
@Reference
BundleActivator ba;

@Referenc
MyService myService;

@Activate void activate(BundleContext context) throws Exception {
ba.start(context);
}

@Deactivate void deactivate(BundleContext context) throws Exception {
ba.stop(context);
}
}

关于java - OSGI:声明性服务在捆绑启动后可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38815998/

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