OSGI捆绑优先级机制

时间:2013-06-14 13:01:50

标签: java osgi osgi-bundle

我有一个使用OSGI模型的java应用程序:

我有两个预先存在的捆绑包:

  1. com.mos
  2. com.login
  3. com.login具有Authenticator服务(用于身份验证的自有服务)的实施和注册。com.login以及com.mos使用此身份验证服务。

    现在我正在编写一个新的包(com.new),我必须添加/修改Authenticator Service,所以我已经编写了自己的实现。

    启动程序/应用程序后,如果我的新捆绑com.newcom.login后运行,则所有捆绑包都会使用新的Authenticator Service。但如果com.new捆绑包在com.login之前运行1}}然后旧的Authenticator Service可用。

    OSGI中是否存在任何机制,我们会优先考虑哪些应该首先启动捆绑包。

2 个答案:

答案 0 :(得分:1)

OSGi包startlevels允许您影响每个包的开始顺序。 查看相应的javadocs http://www.osgi.org/javadoc/r4v43/core/org/osgi/framework/startlevel/package-summary.html 但我不建议这样做。 通常不应将启动级别用作控制服务启动的方法。在OSGi服务中,服务启动订单无法保证,服务可随意出入。

根据Authenticator服务的具体实现制作新的捆绑包(com.new)可以解决问题并保证正确的顺序。

答案 1 :(得分:1)

通常,当您有多个可用的OSGi服务时,您有两个选择选项:

  1. Service Filter
  2. Service Ranking
  3. 服务过滤器可用于根据herehere所述的服务属性过滤服务。

    该服务发布的

    服务排名使其有资格根据服务排名获取。将按照herehere所述选择服务等级最高的那个。

    根据BundleContext.getServiceReference()方法的文档:

      

    如果存在多个此类服务,则选择具有最高优先级的服务。此优先级定义为返回具有最高排名(在其Constants.SERVICE_RANKING属性中指定)的服务引用。

         

    如果排名有关系,则服务ID最低的服务(在Constants.SERVICE_ID属性中指定);也就是说,返回首先注册的服务。