注入列表时,OSGi是否执行服务排名顺序

问题描述

在服务中使用@Reference注入对多个服务(ReferenceCardinality.MULTIPLE)实现的引用时,Osgi如何保证注入的服务的顺序?是否总是按service.ranking排序。

目前,我正在执行以下操作:

@Reference(
    service = SomeInterface.class,cardinality = ReferenceCardinality.MULTIPLE,policy = ReferencePolicy.DYNAMIC,policyOption = ReferencePolicyOption.GREEDY,fieldOption = FieldOption.UPDATE
)
private final List<SomeInterface> refs = new copyOnWriteArrayList<>();

(注释是Osgi R7注释)

测试时,我总是看到列表refs中的元素按其service.ranking的降序排列,但是我不知道这是设计使然还是偶然的,以及Osgi是否保证。在规范或任何博客文章中都没有找到明确的答案。

此外,当为policypolicyOptionfieldOption使用不同的值时,这是否成立?

解决方法

由于您要提供自己的列表(而不是让声明式服务(DS)提供列表),因此DS只能在列表对象上调用addremove。参见https://docs.osgi.org/specification/osgi.cmpn/7.0.0/service.component.html#d0e37871

由于DS仅调用您的列表对象,因此您的列表实现必须负责任何所需的排序。

如果让DS提供该列表,则该列表将始终排序:“根据服务排名和服务ID使用与ServiceReference.compareTo相同的排序方式进行排序”。参见https://docs.osgi.org/specification/osgi.cmpn/7.0.0/service.component.html#d0e37828