【问题标题】:OSGI bundle priority mechanismOSGI 捆绑优先级机制
【发布时间】:2013-06-14 13:01:50
【问题描述】:

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

我有两个预先存在的包:

  1. com.mos
  2. com.login

com.login 实现并注册了Authenticator 服务(自己的身份验证服务)。com.login 以及com.mos 使用此身份验证服务。

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

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

OSGI 中是否有任何机制可以让我们优先考虑应该首先启动哪个包。

【问题讨论】:

  • 那么您要确保始终使用新的身份验证器服务吗?然后你可以像@Thomas 建议的那样引入依赖项(我也会避免调整 startlevels)。或者您想在运行时动态找出哪个是最好的验证器(即,一旦可用就使用新的验证器)?然后,您可以使用 ServiceListener 或 ServiceTracker 以及合适的过滤器来始终了解哪些身份验证器可用。

标签: java osgi osgi-bundle


【解决方案1】:

OSGi 包启动级别允许您影响每个包的启动顺序。 请参阅相应的 javadocs http://www.osgi.org/javadoc/r4v43/core/org/osgi/framework/startlevel/package-summary.html 但我不建议这样做。 启动级别通常不应用作控制服务启动的一种方式。在 OSGi 中,服务启动顺序并不能保证,服务可以随意来来去去。

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

【讨论】:

    【解决方案2】:

    一般来说,当您有多个可用的 OSGi 服务时,您有两种选择:

    1. Service Filter
    2. Service Ranking

    服务过滤器可用于根据herehere 所述的服务属性过滤服务。

    服务发布的

    服务排名使他们有资格根据服务排名被提取。如herehere 所述,服务排名最高的将被选中。

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

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

    如果排名相同,则服务 ID 最低的服务(在其 Constants.SERVICE_ID 属性中指定);即返回最先注册的服务。

    【讨论】:

      猜你喜欢
      • 2019-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-07
      • 2014-09-01
      • 1970-01-01
      • 2014-12-21
      相关资源
      最近更新 更多