1

我知道可以使用属性通配符从 OSGI 服务注册表中查找服务。这个问题是关于反过来做的。

基本上你注册一个这样的服务:

Map<String, String. prop = new HashMap<String, String>();
prop.put("name", "europe-*"); // this is the point - the service is registered with property containing wildcard 
context.registerService(IService.class.getName(), new ContinentServiceEuropeImpl(), prop);

然后你想用这个属性的具体值来查找这个服务,像这样:

ServiceTracker primaryTracker = new ServiceTracker(bundleContext, "(&(objectClass=<IService class name here>)(name=europe-spain))", null);

这不会找到服务,因为服务注册属性不被视为通配符,即只有在您特别要求时才能找到服务(name=europe-*)- (不确定在查找 * 文字时是否必须转义 *)

为了对比这一点——通常是相反的——你注册一个具有具体属性值的服务,即(name=europe-spain),然后你通过使用来查找它(name=europe-*)——这可行,但不幸的是这不是我所需要的。

4

1 回答 1

2

它不是那样工作的。服务注册中的属性是可以使用过滤表达式搜索的值。

您可以这样做:

ServiceTracker primaryTracker = new ServiceTracker(bundleContext, "(&(objectClass=<IService class name here>)(|(name=europe-spain)(name=europe-\\*))", null);

它将寻找 europe-spain 或 europe-*。或者您可以使用它支持的名称值注册服务:

prop.put("name", new String[]{"europe-spain","europe-france",...});
于 2013-04-19T17:11:40.950 回答