代码之家  ›  专栏  ›  技术社区  ›  Paul Schifferer

找不到服务,因为未激活OSGi包

  •  5
  • Paul Schifferer  · 技术社区  · 15 年前

    我发现一些没有被激活的OSGi包提供的服务有问题。让我描述一下情况:

    • bundle a定义接口x
    • 包B、C和D提供实现接口X的服务
      • 这些bundle的服务是通过spring dm注册的,因此只有当bundle被激活并且spring dm初始化bundle中定义的应用程序上下文时才会创建这些服务。
    • bundle a被激活,并且在某个时刻向服务注册表请求接口x的服务。它找不到任何服务,因为bundle b、c和d没有被移动到活动状态(它们只被解析)。

    我似乎无法启动B、C或D包,因此无法注册它们的服务。强迫他们从添加到 config.ini 不是一个选项,因为在实现接口X的应用程序中(通过类似Eclipse P2的更新机制)可以安装任意数量的包。

    该应用程序是基于Eclipse3.5的RCP应用程序,使用Spring2.5.6和Springdm1.2.1。

    如何强制激活这些包?

    3 回复  |  直到 14 年前
        1
  •  6
  •   Mark Elliot    15 年前

    您真正拥有的是一个依赖层次问题,您提出的黑客解决方案实际上只是对底层问题的一个辅助。

    您真正应该考虑的是系统的体系结构,实际上您拥有的是一个循环依赖关系(关于:在评论中讨论您的原始文章)。你有(喜欢与否)A需要B和C提供服务(在某种意义上取决于B和C)。同时,B和C直接依赖A,因此, 不能 开始直到A出现。

    在最好的情况下,您可以用B和C编写代码来监听A的存在,但这充其量只是掩盖了(正如我提到的)基础问题。你真正应该考虑的是把A分成两个束,我们称之为A1和A2。

    A1应提供B和C所需的接口(取决于)。A2应该有B和C所依赖的服务的侦听器。在启动时,如果B和C是必需的服务,A1必须运行,但A2可以在以后的任何时候启动,所有的工作都应该正常。

        2
  •  0
  •   Paul Schifferer    15 年前

    我想我已经找到了解决这个问题的方法,尽管感觉有点老土。

    我跑过去 this thread Adrian Colyer暗示,当捆绑包安装到框架中时,外部“捆绑包观察者”可能负责激活它们。

    所以,我的解决方案是:

    • 将自定义头添加到bundle b、c和d各自的清单中,例如“myapp autostart:true”
    • 创建一个bundle侦听器,该侦听器在bundle移动到解析状态时响应,并查找头
    • 如果头的值为“true”,则bundle listener将调用 bundle.start()

    使用此方法,可以启动我想要启动的包,而不必使用 config.ini 他们可以随心所欲地来来去去,但当被询问时,他们的服务是可用的。

        3
  •  0
  •   Leen Toelen    15 年前

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