5

我在发现某些未激活的 OSGi 捆绑包提供的服务时遇到问题。让我描述一下情况:

  • Bundle A 定义了接口 X
  • Bundle B、C 和 D 提供实现接口 X 的服务
    • 这些包的服务是通过 Spring DM 注册的,因此它们仅在包被激活并且 Spring DM 初始化包中定义的应用程序上下文时创建
  • Bundle A 被激活,并且在某些时候向服务注册中心询问接口 X 的服务。它没有找到任何服务,因为 bundle B、C 和 D 尚未进入 ACTIVE 状态(它们只是 RESOLVED)。

我似乎无法启动捆绑包 B、C 或 D,因此无法注册它们的服务。不能通过将它们添加到来强制它们开始config.ini,因为可以在应用程序中安装任意数量的包(通过类似 Eclipse p2 的更新机制)实现接口 X。

该应用程序是基于 Eclipse 3.5 的 RCP 应用程序,使用 Spring 2.5.6 和 Spring DM 1.2.1。

如何强制激活这些捆绑包?

4

3 回答 3

6

您真正拥有的是依赖层次结构问题,您提出的 hacky 解决方案实际上只是潜在问题的创可贴。

您真正应该考虑的是系统的体系结构,实际上您所拥有的是循环依赖(回复:在您的原始帖子的评论中进行讨论)。你有(喜欢与否)A 需要来自(并且在某种意义上依赖于)B 和 C 的服务。同时,B 和 C 直接依赖于 A,因此,在 A 出现之前无法启动。

在最好的情况下,您可以在 B 和 C 中编写代码来监听 A 的存在,但这充其量掩盖了(正如我所提到的)根本问题。您真正应该考虑的是将 A 拆分为两个捆绑包,我们称它们为 A1 和 A2。

A1 应该提供 B 和 C 需要(依赖)的接口。A2 应该有 B 和 C 所依赖的服务的侦听器。在启动时,如果 B 和 C 是必需的服务,则必须运行 A1,但 A2 可能会在稍后启动,并且一切正常。

于 2010-01-08T01:41:57.247 回答
0

还可以查看 felix fileinstall,它监视捆绑目录并自动安装和启动它们。删除文件时,捆绑软件也会停止并卸载。

于 2010-02-09T10:29:35.323 回答
0

我想我已经找到了解决这个问题的方法,虽然感觉有点骇人听闻。

我遇到了这个线程,其中 Adrian Colyer 暗示外部“bundle watcher”可能负责在将 bundle 安装到框架中时激活它们。

所以,我的解决方案是:

  • 将自定义标头添加到捆绑包 B、C 和 D 各自的清单中,例如“MyApp-AutoStart: true”
  • 创建一个捆绑侦听器,它在捆绑移动到 RESOLVED 状态时做出响应,并查找标头
  • 如果标头的值为“true”,则捆绑侦听器调用bundle.start()

使用这种方法,我想启动的bundle不用使用usingconfig.ini就可以启动了,可以来来去去,但查询时提供服务。

于 2010-01-07T16:15:43.010 回答