我有一个使用OSGI模型的java应用程序:
我有两个预先存在的捆绑包:
-
com.mos
-
com.login
com.login
具有 Authenticator
service(用于身份验证的自有服务)的实现和注册 . com.login
以及 com.mos
使用此身份验证服务 .
现在我正在编写一个新的包( com.new
),我必须添加/修改Authenticator Service,所以我编写了自己的实现 .
一旦我启动我的程序/应用程序,如果我的新捆绑包 com.new
在 com.login
之后运行,那么所有捆绑包都使用新的 Authenticator Service
. 但是如果 com.new
捆绑包在 com.login
之前运行,那么旧的 Authenticator Service
可用 .
在 OSGI
中是否有任何机制,我们给出一些优先级,比如哪个bundle应该首先启动 .
2 回答
OSGi包startlevels允许您影响每个包的开始顺序 . 请参阅相应的javadocs http://www.osgi.org/javadoc/r4v43/core/org/osgi/framework/startlevel/package-summary.html但我不建议这样做 . 通常不应将启动级别用作控制服务启动的方法 . 在OSGi服务中,服务启动订单无法保证,服务可随意出入 .
根据Authenticator服务的具体实现制作新的包(com.new)可以完成这一操作,并保证正确的顺序 .
通常,当您有多个可用的OSGi服务时,您有两个选择:
Service Filter
Service Ranking
Service Filter 可用于根据服务属性过滤掉服务,如here或here所述 .
该服务发布的 Service Ranking 使他们有资格根据服务排名获取 . 如here或here所述,将获取具有最高服务等级的那个 .
根据BundleContext.getServiceReference()方法的文档: