2

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

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

  1. com.mos
  2. com.login

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

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

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

有什么机制OSGI可以让我们优先考虑哪个包应该首先启动。

4

2 回答 2

1

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

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

于 2013-06-14T13:11:12.347 回答
1

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

  1. 服务过滤器
  2. 服务排名

服务过滤器可用于根据此处此处描述的服务属性过滤服务。

服务发布的服务排名使他们有资格根据服务排名进行提取。将按照此处此处的说明选择具有最高服务等级的服务。

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

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

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

于 2014-06-24T17:12:08.633 回答