按属性搜索OSGI服务

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

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

例如:

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

你想在哪里寻找实现MyInterface并且port属性值等于myport

以下是获取引用的相关javadoc。

备注1:

上面的例子和javadoc引用了4.2版。 如果您不限于J2SE 1.4运行时,我建议您查看版本4.3 语法 ,您可以在其中使用generics。

备注2 :(由Ray提供)

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

 Filter filter = bundleContext.createFilter(filterStr); 

这也允许您将filter与其他标准相匹配。 您仍然传递filterStr以获取引用,因为没有重载会占用Filter参数。 但请注意,通过这种方式,您将检查两次正确性: getServiceReferencescreateFilter在解析filter时抛出InvalidSyntaxException 。 我猜,当然不是一个显示效率低下的效率,但值得一提。

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

如果您使用的是声明式服务(我通常建议使用),则可以将filter添加到服务引用的target属性中。 例如(使用DS的bnd注释):

 @Reference(target = "(port=8080)") public void setHttpService(HttpService http) { // ... } 

在Blueprint中,您可以在reference或reference-list元素上指定filter属性。 例如: