【问题标题】:OSGI: do declarative services become available after bundle startOSGI:捆绑启动后声明性服务是否可用
【发布时间】:2016-08-07 16:05:43
【问题描述】:

问题很简单,但我找不到答案 - 我可以声明捆绑 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 运行时正在运行,配置存在并且所有强制引用都存在。

【问题讨论】:

  • 这些是很多假设,你真的无法做出。

标签: java osgi apache-felix declarative-services


【解决方案1】:

您的问题的答案很简单:不。无论是基于时间还是顺序,都无法保证 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);
    }
 }      

【讨论】:

  • 假设我只有一个声明式服务 - 服务 A。我需要在普通代码中使用此服务,而不是在另一个 osgi 服务中。那么我理解你的意思吗 - 在这种情况下唯一的方法是使用服务跟踪器?
  • ServiceTracker 可以工作,但有一个更简单的解决方案。问题是 control 之一(我认为这是编写代码时最有趣且讨论最少的方面之一)。我可能会在非 OSGi 端注册一个 BundleActivator 服务,然后在 OSGi 端创建一个具有适当依赖关系的直接 DS 组件。该组件在激活/停用时调用框架端服务。这样,您就可以在 DS 端进行控制,而非 OSGi 端则跟随它。
  • 我多次阅读你的评论.. 但是.. 你能用代码举例说明你的意思吗?
  • 非常感谢,现在我需要了解您的代码。对不起我的问题......在你的代码之后,我想我根本不知道 osgi。什么是框架?这是什么课?
  • 那我可能误解了你的问题。我了解您将代码作为捆绑包和在框架外运行的代码运行。如果您的所有代码都作为一个包运行,那么为什么不直接使用 DS?
【解决方案2】:

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

【讨论】:

  • 在这种情况下,只有延迟加载仍然是一个原因。你使用 immediate=true 吗?
  • 我认为可用服务和创建实例的服务之间存在差异。当我说可用时,我的意思是如果这个服务是必要的,那么 OSGI 框架将创建它的实例。
  • 老实说,我对您真正要问的内容有些困惑。这只是一个理论上的问题,还是您有一个似乎没有启动的具体服务。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-22
  • 1970-01-01
  • 2014-12-21
  • 1970-01-01
  • 2011-10-14
  • 2015-02-06
相关资源
最近更新 更多