【问题标题】:How to extend / amend OSGi lifecycle management?如何扩展/修改 OSGi 生命周期管理?
【发布时间】:2009-10-14 09:29:12
【问题描述】:

我有一个模块化应用程序,它使用 OSGi 进行生命周期和依赖管理。但是,某些捆绑包在启动后需要一些时间才能准备就绪,例如,因为它们必须从某个地方获取数据。此外,它们可能无法在配置更新期间处理某些调用,例如,与数据库保持连接的包在更新连接参数时无法发送查询。

所以,在我看来,bundle 可以拥有比 OSGi 容器管理的状态更微妙的状态,并且由于它们会影响 bundle 交互,因此需要进行一些处理。我可以看到执行此操作的三种基本策略:

  • 螺丝精巧,例如将所有初始化代码放入BundleActivator.start()。如果获取该数据需要很长时间,那么捆绑软件就不会永远启动。我不能 100% 确定这会涵盖所有情况,而且似乎有点错误。
  • 为我的捆绑包添加一个额外的事件系统,它们用于通知彼此更微妙的状态,例如“暂时不可用”或“现在真的准备好了”。这可能只是不必要的开销。
  • 让捆绑包保持其自身更微妙的状态变化,无论如何都只接听电话,必要时在内部推迟它们。当调用者实际上可以更好地处理不可用性时,这可能不合适。

您对此有何一般性建议? OSGi 中是否有我可以使用的东西?

【问题讨论】:

    标签: java osgi


    【解决方案1】:

    尝试使用服务和服务跟踪器在包之间进行通信。这也有助于解耦你的包,因为你可能会使用接口。

    使用您与数据库对话的捆绑示例:

    1. Activator.start(),启动一个后台线程来做你的初始化业务。激活器应该快速执行。
    2. 注册一个服务,为其他包提供所需的与数据库相关的抽象。
    3. 其他捆绑包会创建一个服务跟踪器来寻找他们需要的服务,
    4. 仅当第一个捆绑包注册服务时,其他捆绑包才会在服务跟踪器中获得回调。第一个捆绑包仅在服务准备就绪时才注册服务,这意味着其他捆绑包可以立即开始使用它。

    【讨论】:

    • 那么(2)/(4)中的注册不会从Activator.start()中完成,而是从(1)中启动的后台线程完成?
    • 您可以在任何地方进行注册/跟踪
    猜你喜欢
    • 2015-08-11
    • 2015-09-24
    • 2012-11-24
    • 1970-01-01
    • 1970-01-01
    • 2017-08-21
    • 1970-01-01
    • 1970-01-01
    • 2011-10-06
    相关资源
    最近更新 更多