问题很简单,但我找不到答案-我可以说捆绑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);
    }
 }

10-04 23:44
查看更多