【问题标题】:Osgi Equinox enable component from external bundleOsgi Equinox 从外部包启用组件
【发布时间】:2013-09-24 12:54:23
【问题描述】:

鉴于这种情况:

Bundle A:组件 1A(启用:false) Bundle B:组件 2B

如何从 Bundle B 或组件 2B 启用组件 1A?

我已经尝试通过使用 componentContext 来做到这一点,

dsContext.enableComponent("1A");

但它似乎只适用于同一捆绑包中的服务。

【问题讨论】:

    标签: osgi bundle equinox declarative-services


    【解决方案1】:

    您使用了一种用于管理的机制,并且您似乎想在应用程序级别使用它。声明式服务应通过其依赖项或通过特定于域的方式启用/禁用。您应该让另一个参与者启用/禁用组件。使用这条路线,您可能会得到非常复杂的系统,因为很难控制时间和顺序。

    从技术上讲,您应该使用 Apache Felix SCR 服务来控制 DS 的启用/禁用,遗憾的是这还没有标准化,因此需要 Apache Felix SCR 作为 DS 的实现。

    如果您解释为什么要启用/禁用其他组件,可能会为您指出更好的解决方案。

    【讨论】:

    • 感谢彼得的快速回答。事实上,实际情况要复杂得多。我正在尝试使用 OSGI Equinox 和 zookeeper/exhibitor 自动进行故障转移,因此我可以实现几个以高可用性运行的 OSGI。我可以重写问题...我需要以编程方式停止/启动捆绑包或组件,因为使用 DS 的捆绑包必须处于 START 状态才能真正提供服务。
    • 实际上 Peter,Equinox 和 Knopflerfish SCR 实现也实现了由 Felix 定义的 ScrService。所以它已经是一个事实上的标准了......它应该真的在规范中!
    • 让我再次解释一下这个场景: - Bundle SwitchOver 有一个 zookeper/exhibitor 和 leader 选举配方。当它成为领导者时,它必须“启动”包 A,当它失去领导权时,它必须停止包 A。 - 包 A:它必须处于 START 状态,因为它提供并使用声明性服务。这个包有一堆组件,其中一个运行主代码,所以启动/停止它真的意味着做某事或不做某事。鉴于此,我终于使用了一个虚拟组件来启动/停止包 A,因为它是包 A 中主要组件的强制引用...
    • 当“switchoverbundle”运行时,它可以通过工厂创建或处理这个“虚拟”组件,以启动/停止在 Bundle A 上运行的东西。当我在独立模式下运行时(不需要高可用性),并且切换包不存在(未运行)。包 A 的 Activator 负责创建这个虚拟组件,首先检查包“切换”没有运行
    • 所以诀窍是注册一个Leader服务,然后依赖它。永远不要,在这些应用场景中重复永远不要启动/停止包。启动/停止、启用、禁用是管理原语。使用它们会使很多事情变得困难。使用服务来管理这些依赖关系。
    猜你喜欢
    • 1970-01-01
    • 2014-11-01
    • 2012-01-26
    • 2017-04-16
    • 2014-11-02
    • 2011-06-08
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    相关资源
    最近更新 更多