具有可选贪心的 OSGI 组件初始化顺序

OSGI component initialization order with optional greedy

我正在使用 Osgi DS(在 AEM 环境中)。

我有一项服务 A 由组件 AImpl 提供,它可以但不必处于活动状态(这取决于是否存在它的配置)。

有些系统有它,有些则没有,但它是预先确定的,并且在启动时已知。

现在我有其他组件(比方说 BImpl)可以选择将其与 STATIC、OPTIONAL、GREEDY 引用类型一起使用。

现在,我如何才能确保 Bimpl 在启动期间首次初始化时能够在它处于活动状态的系统上获取它。 换句话说,我如何确保 BImpl 将始终在 AImpl 之后在 AImpl 应该被初始化的系统上初始化要活跃吗?

我不想避免 BImplAImplBImpl 之间没有硬初始化依赖的情况 首先初始化,然后在 AImpl 在启动期间最终激活时重新启动。

如果可能,我想避免使用启动级别(通常不建议对 AEM 中的用户级组件使用非默认启动级别)。

这里主要有三个选项:

  1. 别担心。事实上,您的 BImpl 有一个 static greedy 引用意味着当 AImpl 被注册时,BImpl 将被注入它,即使这意味着销毁并重新初始化 BImpl 组件。这就是静态引用应该如何工作,如果 AImpl 是 unregistered/updated.

  2. 就会发生什么
  3. 能否使BImpl组件具有所需的配置?如果可以,那么您可以使用该配置将 AImpl 引用的最小基数从零更改为一。这将使它成为强制性参考,并确保您的 BImpl 在 AIMpl 可用之前不会启动。引用的最小基数配置为 defined in the specification,可以使用配置管理动态设置。

  4. 与 2 类似,但创建一个 APrimeImpl,它使用存根实现实现 A 并具有所需的配置。使用此配置激活存根 A(或不激活),然后使 BImpl(和所有实现)对 A 使用强制引用。这样您只需更改一个配置即可强制每个人使用真正的 AImpl。另一方面,您失去了使某些引用成为强制性引用而其他引用成为可选引用的能力。

选项 1 绝对是最简单的,也是我通常会向人们推荐的选项。