按属性搜索OSGI服务

时间:2012-06-22 06:47:44

标签: java osgi

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

3 个答案:

答案 0 :(得分:18)

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

例如:

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

您要查找实施MyInterface并且port属性值等于myport的服务。

Here是获取引用的相关javadoc。

备注1:

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

备注2 :(由Ray提供)

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

Filter filter = bundleContext.createFilter(filterStr);  

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

答案 1 :(得分:8)

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

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

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

答案 2 :(得分:2)

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

<reference id="sampleRef"
        interface="org.sample.MyInterface"
        filter="(port=5000)"/>