16

如何通过属性区分实现相同接口的已发布 OSGI 服务?

4

3 回答 3

19

假设您要根据某些属性值检索已注册的服务,则需要使用过滤器(基于LDAP语法)。

例如:

int myport = 5000;
String filter = "&(objectClass=" + MyInterface.class.getName() 
                + ")(port=" + myport + ")";
ServiceReference[] serviceReferences = bundleContext.getServiceReferences(null,filter);

您要在其中查找既实现MyInterface又具有port等于 的属性值的服务myport

是获取参考的相关javadoc。

备注1:

上面的例子和 javadoc 参考的是 Release 4.2。如果您不限于 J2SE 1.4 运行时,我建议您查看 Release 4.3语法,您可以在其中使用泛型。

备注 2:(由 Ray 提供)

您还可以通过从字符串创建Filter对象来预先检查过滤器的正确性:filterStr

Filter filter = bundleContext.createFilter(filterStr);  

这还允许您将过滤器与其他条件匹配。您仍然通过filterStr获取引用,因为没有重载导致Filter参数。但是请注意,通过这种方式,您将检查两次正确性:两次检查getServiceReferencescreateFilter解析InvalidSyntaxException过滤器。我想,这当然不是一个显着的低效率,但值得一提。

于 2012-06-22T07:08:13.573 回答
9

Luca 上面的回答是正确的,但是它假设您使用低级 API 来访问服务。

如果您使用的是声明式服务(我通常会推荐),那么可以将过滤器添加到target服务引用的属性中。例如(使用 DS 的 bnd 注释):

@Reference(target = "(port=8080)")
public void setHttpService(HttpService http) {
    // ...
}
于 2012-06-22T13:32:15.953 回答
2

在蓝图中,您可以在引用或引用列表元素上指定过滤器属性。例如:

<reference id="sampleRef"
        interface="org.sample.MyInterface"
        filter="(port=5000)"/>
于 2012-06-25T05:25:38.063 回答