OSGI:捆绑启动后声明性服务变得可用

时间:2016-08-07 16:05:43

标签: java osgi apache-felix declarative-services

问题很简单,但我找不到答案 - 我可以说捆绑A开始后捆绑A中的所有声明性服务都可用吗?例如,

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

P.S。我使用apache felix,但我认为它必须在Specs中定义,但不能在实现中定义。

修改
我假设DS运行时正在运行,存在配置并且存在所有必需的引用。

2 个答案:

答案 0 :(得分:2)

你的问题的答案非常简单:不。 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);
    }
 }      

答案 1 :(得分:0)

您不能假设捆绑包启动后所有DS组件都可用作服务。第一件事是DS运行时也必须运行。然后,默认情况下,DS组件会被延迟激活。这意味着它们仅在某些其他捆绑包需要此类服务时才处于活动状态,并且只有当所有强制引用都存在时才会激活最后但并非最不重要的组件。 嗯......在我忘记之前你还可以定义一个组件只有在有配置的情况下才会被激活。