我有一个使用OSGI模型的java应用程序:
我有两个预先存在的捆绑包:
com.login
具有Authenticator
服务(用于身份验证的自有服务)的实施和注册。com.login
以及com.mos
使用此身份验证服务。
现在我正在编写一个新的包(com.new
),我必须添加/修改Authenticator Service,所以我已经编写了自己的实现。
启动程序/应用程序后,如果我的新捆绑com.new
在com.login
后运行,则所有捆绑包都会使用新的Authenticator Service
。但如果com.new
捆绑包在com.login
之前运行1}}然后旧的Authenticator Service
可用。
OSGI
中是否存在任何机制,我们会优先考虑哪些应该首先启动捆绑包。
答案 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服务时,您有两个选择选项:
服务过滤器可用于根据here或here所述的服务属性过滤服务。
该服务发布的服务排名使其有资格根据服务排名获取。将按照here或here所述选择服务等级最高的那个。
根据BundleContext.getServiceReference()方法的文档:
如果存在多个此类服务,则选择具有最高优先级的服务。此优先级定义为返回具有最高排名(在其Constants.SERVICE_RANKING属性中指定)的服务引用。
如果排名有关系,则服务ID最低的服务(在Constants.SERVICE_ID属性中指定);也就是说,返回首先注册的服务。