具有ds注释的一个目标服务的多个PID

时间:2015-07-05 13:51:41

标签: java osgi declarative-services

我想知道是否有可能利用声明性服务注释来利用osgi企业规范的参数104.7.5(使用多地点)所解释的内容。引用规范:

  

Bundles也可能对一个目标服务的多个PID感兴趣,因此他们可以为一个服务注册多个PID。   [...]

     

对主机配置感兴趣的Bundle将注册具有以下属性的托管服务:

GREAT!
     

对于service.pid = [ "com.acme.host", "com.acme.system" ] com.acme.host PID,将回叫Bundle,因此必须区分这两种情况。因此,此托管服务将具有回调,如:

com.acme.system

我尝试使用以下语法:

volatile URL url;
public void updated( Dictionary d ) {
if ( d.get("service.pid").equals("com.acme.host"))
    this.url = new URL( d.get("host"));
if ( d.get("service.pid").equals("com.acme.system"))
   ...
}

但这失败了。当然,人们可以获得对config admin的引用并根据所需的pid浏览配置,但这对我来说似乎有点不合适,因为理论上可以将其委托给ds注释。

有可能吗?什么是正确的语法?

谢谢!

3 个答案:

答案 0 :(得分:2)

我认为使用configurationPidconfigurationPolicy值不可能。我的工作如下:

  • 将服务工厂pid定义为服务属性。
  • 实施ManagedService界面。

示例:

@Component(property = {Constants.SERVICE_PID + "=com.acme.host", 
                       Constants.SERVICE_PID + "=com.acme.system"})
public class TestComponent implements ManagedService {

    @Override
    public void updated(Dictionary<String, ?> dict) {
    ...
    }

当然,这样做的缺点是,即使没有配置,您的组件也会被激活,但可以使用两个PID。

答案 1 :(得分:0)

即将发布的DS 1.3规范支持多个PID。有关下载草案版本6规范的链接,请参阅http://www.osgi.org/Specifications/Drafts

答案 2 :(得分:0)

较新的版本解决了该问题...

发件人:https://osgi.org/specification/osgi.cmpn/7.0.0/service.component.html#org.osgi.service.component.annotations.Component

  

112.13.4.11 String [] configurationPid默认值“ $”□用于此组件配置的配置PID。

     

每个值都为此组件指定一个配置PID。

     

如果未指定任何值,则将此组件的名称用作   该组件的配置PID。

     

可以使用特殊字符串(“ $”)来指定   组件作为配置PID。 NAME常量保留此特殊设置   串。例如:

     

@Component(configurationPid = {“ com.acme.system”,Component.NAME})   根据此注释创建组件描述的工具必须   用该组件的实际名称替换特殊字符串。

     

另请参见a的component元素的configuration-pid属性。   组件说明。

     

自   1.2