从外部捆绑包启用Osgi Equinox组件

从外部捆绑包启用Osgi Equinox组件,osgi,bundle,equinox,declarative-services,Osgi,Bundle,Equinox,Declarative Services,在这种情况下: 捆绑包A:组件1A(启用:false) 束B:组件2B 如何从捆绑包B或组件2B启用组件1A 我试着使用componentContext dsContext.enableComponent("1A"); 但它似乎只适用于同一捆绑包中的服务。您使用的是一种专门用于管理的机制,并且似乎希望在应用程序级别使用它。声明性服务应通过其依赖项或特定于域的方式启用/禁用。您不应该让其他参与者启用/禁用组件。使用此路线,您可能会得到非常复杂的系统,因为很难控制时间和顺序 从技术上讲,您应该使用

在这种情况下:

捆绑包A:组件1A(启用:false) 束B:组件2B

如何从捆绑包B或组件2B启用组件1A

我试着使用componentContext

dsContext.enableComponent("1A");

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

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

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


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

谢谢您的快速回答。事实上,实际情况更为复杂。我正在尝试使用OSGI equinox和zookeeper/exhibitor自动进行故障切换,这样我就可以实现几个OSGIs在高可用性下运行。我可以重写这个问题。。。我需要以编程方式停止/启动捆绑包或组件,因为使用DS的捆绑包必须处于启动状态才能真正提供服务。所以这已经是事实上的标准了。。。它真的应该在规范中!让我再次解释一下场景:-捆绑包切换有一个zookeper/参展商和领导者选举食谱。当它成为领导时,它必须“启动”捆绑包A,当它失去领导时,它必须停止捆绑包A。-捆绑包A:它必须处于启动状态,因为它提供并使用声明性服务。这个捆绑包有一堆组件,其中一个运行主代码,因此启动/停止它实际上意味着要做什么或不做什么。考虑到这一点,我最终使用了一个虚拟组件,它允许我启动/停止捆绑包a,因为它是捆绑包a中主要组件的强制引用。当“switchoverbundle”运行时,它可以通过工厂创建或处理这个“虚拟”组件,以便启动/停止捆绑包a上的运行。当我以独立模式运行时(不需要高可用性),并且切换捆绑包不存在(未运行)。捆绑包A的Activator负责通过首先检查捆绑包“切换”来创建此虚拟组件没有运行,所以诀窍是注册一个Leader服务,然后依赖它。在这些应用程序场景中,从不重复从不启动/停止捆绑包。启动/停止、启用、禁用是管理原语。使用它们会使很多事情变得困难。使用服务来管理此类依赖关系。