【问题标题】:Is it possible to disable an OSGi component programmatically in CQ?是否可以在 CQ 中以编程方式禁用 OSGi 组件?
【发布时间】:2014-06-01 18:50:29
【问题描述】:

与其在 Felix 中手动对 OSGi 组件进行配置更改,不如在 JCR 中创建 sling:OsgiConfig 节点以确保设置受版本控制、跨环境应用相同等。

同样,我想在每个环境中禁用一个开箱即用的组件。有没有办法通过配置来实现这一点?而不是去system/console/components 并在那里禁用它?

我所读到的任何关于此的内容都提到在捆绑包内部进行更改,但由于它不是我拥有的,因此我需要一些外部配置来执行此操作。

【问题讨论】:

    标签: osgi aem


    【解决方案1】:

    您可以使用由 SCR 运行时捆绑包发布的 ScrService 来执行此操作。 API 文档是here

    请注意,ScrService 不是“标准的”,即它不是来自 OSGi 规范。但是它受到 Felix、Equinox 和 Knopflerfish 的支持,因此它几乎是一个事实上的标准。实际上,当您转到system/console/components 时,Web 控制台会使用此服务。

    【讨论】:

    • 是否有计划在未来的 OSGi 规范中包含 ScrService?看起来很有用。
    【解决方案2】:

    尝试在@Component 上使用属性policy=ConfigurationPolicy.REQUIRE

    然后,您可以为每个环境准备一组包含配置的包作为构建的一部分。这也是为每个环境设置不同 OSGI 配置的好习惯。

    因此,对于某些环境,您可以简单地不为特定组件提供配置。这样的组件不会运行 - 它的状态会不满足。

    我相信我已经在 AEM 本身中看到了这种方法。

    您也可以创建一个过滤器来删除当前配置,但它仍然需要至少禁用该组件一次。只有当这个组件提到了策略时,这个解决方案才会起作用。

    另一种方法是准备一个负责禁用其他组件的服务 - 它可以是可配置的。但这听起来对我来说不是一个好的解决方案。

    【讨论】:

    • 您好,Michal,感谢您的回答。我遇到的问题是我要禁用的组件是 Adob​​e 提供的已编译 JAR 的一部分,因此我无法对注释进行修改。
    • 您能否指定它是哪个组件以及为什么要禁用它?
    • 我已经扩展了我的答案,但知道你想要实现什么仍然很有用。
    • 我想禁用该组件,以便提供我自己的它所公开的服务的实现。据我了解,如果同一服务的两个版本可用,那么 OSGi 运行时将决定使用哪个实现,所以我可以得到任何一个。
    • 是的,没错。但是,每个 OSGI 服务都可以有一个SERVICE_RANKING 属性,用于对服务进行优先级排序,并返回排名最高的服务。另一种选择是在 OSGI @Reference(target = "(feedbackType=data)") 中使用过滤器。请扩展您的问题,以便我可以编辑我的答案。
    猜你喜欢
    • 2012-03-22
    • 2015-02-06
    • 1970-01-01
    • 2016-12-10
    • 1970-01-01
    • 1970-01-01
    • 2017-10-02
    • 2011-11-04
    相关资源
    最近更新 更多