【问题标题】:Can OSGi frameworks start bundles concurrently?OSGi 框架可以同时启动捆绑包吗?
【发布时间】:2012-05-25 08:52:31
【问题描述】:

我们有两个捆绑包,都嵌入了同一个第三方库的不同版本,我们必须以不同的配置使用它们。不幸的是,该库只能通过系统属性进行配置。

所以,我们尝试在Activator 类中执行以下操作:

  1. 设置所需的系统属性,
  2. 初始化库,
  3. 取消设置以前的系统属性。

如果 OSGi 框架同时启动这两个包,它将无法工作。是否允许 OSGi 框架实现?这个解决方案安全吗?有没有其他方法可以为不同的捆绑包将相同的系统属性设置为不同的值?

(如果可能,我们希望避免为这些捆绑包设置不同的启动级别。)

【问题讨论】:

    标签: java osgi bundle system-properties


    【解决方案1】:

    允许 OSGi 框架实现在给定的启动级别内同时启动捆绑包。因此,您可以将捆绑包置于不同的启动级别,以确保一个在另一个之前启动。

    【讨论】:

      【解决方案2】:

      在 Felix 和 Equinox 中,捆绑安装/解析/启动/停止/卸载操作都发生在单个线程上。我无法确定激活器是否在同一线程上运行,但我认为确实如此。

      【讨论】:

        【解决方案3】:

        如何创建一个封装库初始化的 OSGi 服务。所以你只需要做一次。或者,服务可以同步初始化,因此确保它不会同时发生。

        【讨论】:

        • 谢谢!它可以工作,服务必须回调两个初始化代码,或者我们可以在激活器中使用某种信号量服务来防止并发初始化。
        【解决方案4】:

        将它们放在单独的捆绑包中是否有很强的要求? 您如何处理这些库,是将它们导出为 java 包还是使用它们创建服务? 如果您可以将两个库放在同一个包中,则您可以完全控制哪个首先初始化,哪个第二个初始化。

        顺便说一句,如果您使用 Export-Package 在捆绑清单中导出它们,请记住,即使捆绑处于 RESOLVED 状态(即已安装但尚未启动),其他捆绑也可以使用导出的包。因此,即使在您的 Bundle Activator 创建并完成初始化之前,也可能有人调用 lib 的方法....

        【讨论】:

        • 感谢您的回答!它们是同一 3rd 方的不同版本,因此两个库都包含或多或少相同的包和类。因此,如果不使用包内的自定义类加载器将它们分开(我们尽量避免),它们就不能在同一个包中。 (在捆绑包之外只有一项服务可用,而不是包。)
        猜你喜欢
        • 2014-02-03
        • 2017-06-24
        • 1970-01-01
        • 2015-02-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-10
        相关资源
        最近更新 更多