问题很简单,但我找不到答案-我可以说捆绑A启动之后,捆绑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,但我认为它必须在Specs中定义,但不能在实现中定义。
编辑:
我假设DS运行时正在运行,存在config并且存在所有必需的引用。
最佳答案
您的问题的答案很简单:不。无论基于时间还是顺序,都无法保证OSGi的可用性。唯一的保证是在服务事件中指定的。
在代码中进行时序/排序假设是最复杂的原因之一,因为它们总是以最晦涩的方式被违反。
DS使得编写代码可以对服务依赖关系进行正确的响应变得很简单。确保获得与服务相关的保证非常复杂,并且如果您开始假设调用方法后应该提供某些东西,那么您将破坏所有价值。
在您的示例中,仅依靠您需要的服务即可。如果该服务可用,那么您确定所有初始化都已完成。
如果您坚持服务依赖关系,那么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);
}
}