带有可选贪婪的OSGI组件初始化顺序

时间:2018-09-18 10:00:42

标签: java osgi aem

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

我有一个由组件 AImpl 提供的服务 A ,该服务可以但不必处于活动状态(这取决于其配置)。

某些系统具有其他功能,但是它是预先确定的,并且在启动时就知道了。

现在,我还有其他组件(例如 BImpl )可以选择将其与STATIC,OPTIONAL,GREEDY引用类型一起使用。

现在,如何确保 Bimpl 在引导过程中首次初始化时会在其处于活动状态的系统上得到它。 换句话说,如何确保在 AImpl 应该处于活动状态的系统上, BImpl 将始终在 AImpl 之后初始化?

我不想避免 BImpl AImpl 之间没有硬初始化依赖关系的情况,并且 BImpl 首先被初始化然后重新启动 AImpl 在启动过程中最终被激活时。

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

1 个答案:

答案 0 :(得分:1)

这里有三个主要选项:

  1. 不用担心。 BImpl具有 static greedy 引用这一事实意味着,当AImpl注册后,BImpl将被注入,即使这意味着销毁并重新初始化BImpl组件。这就是应该使用静态引用进行工作的方式,并且如果AImpl未注册/更新,也会发生这种情况。

  2. 是否可以使BImpl组件具有所需的配置?如果可以,则可以使用该配置将AImpl引用的最小基数从零更改为一。这将成为强制性参考,并确保您的BImpl在AImpl可用之前不会启动。引用的最小基数的配置为defined in the specification,可以使用Configuration Admin动态设置。

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

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