首页 文章

OSGI捆绑优先级机制

提问于
浏览
2

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

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

  • com.mos

  • com.login

com.login 具有 Authenticator service(用于身份验证的自有服务)的实现和注册 . com.login 以及 com.mos 使用此身份验证服务 .

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

一旦我启动我的程序/应用程序,如果我的新捆绑包 com.newcom.login 之后运行,那么所有捆绑包都使用新的 Authenticator Service . 但是如果 com.new 捆绑包在 com.login 之前运行,那么旧的 Authenticator Service 可用 .

OSGI 中是否有任何机制,我们给出一些优先级,比如哪个bundle应该首先启动 .

2 回答

  • 1

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

    根据Authenticator服务的具体实现制作新的包(com.new)可以完成这一操作,并保证正确的顺序 .

  • 1

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

    Service Filter 可用于根据服务属性过滤掉服务,如herehere所述 .

    该服务发布的 Service Ranking 使他们有资格根据服务排名获取 . 如herehere所述,将获取具有最高服务等级的那个 .

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

    如果存在多个此类服务,则选择具有最高优先级的服务 . 此优先级定义为返回具有最高排名(在其Constants.SERVICE_RANKING属性中指定)的服务引用 . 如果排名有关系,则服务ID最低的服务(在Constants.SERVICE_ID属性中指定);也就是说,返回首先注册的服务 .

相关问题