【问题标题】:OSGI component initialization order with optional greedy带有可选贪心的 OSGI 组件初始化顺序
【发布时间】:2018-09-18 10:00:42
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

    标签: java osgi aem


    【解决方案1】:

    这里有三个主要选项:

    1. 别担心。您的 BImpl 具有 静态贪婪 引用这一事实意味着,当 AImpl 注册时,BImpl 将被注入它,即使这意味着销毁并重新初始化 BImpl 组件。这就是静态引用应该如何工作的方式,如果 AImpl 未注册/更新,这正是会发生的情况。

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

    3. 与 2 类似,但创建一个 APrimeImpl,该 APrimeImpl 使用存根实现实现 A 并具有所需的配置。使用此配置来激活存根 A(或不激活),然后使 BImpl(以及所有实现)对 A 使用强制引用。这样您只需更改一个配置即可强制每个人使用真正的 AImpl。另一方面,您无法将某些参考设置为强制性而其他参考为可选。

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

    【讨论】:

    • 谢谢,我选择了 3 的变体。我不能允许在实际预期 A 的系统上没有 A 的情况下让 B 服务在线。这是因为 B 的行为不正确,即使在重新启动以适应现在存在的 A 之后,它的结果也会被其他服务缓存。
    猜你喜欢
    • 1970-01-01
    • 2019-05-13
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多