【问题标题】:Multiple PIDs for one target service with ds annotations具有 ds 注释的一个目标服务的多个 PID
【发布时间】:2015-07-05 13:51:41
【问题描述】:

我想知道是否可以使用声明性服务注释来利用 osgi 企业规范的 par.104.7.5(使用多位置)中解释的内容。引用规格:

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

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

service.pid = [ "com.acme.host", "com.acme.system" ]

对于com.acme.hostcom.acme.system PID,Bundle 将被回调,因此必须区分这两种情况。因此,此托管服务将具有如下回调:

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"))
   ...
}

我尝试了以下语法:

@Component(
    immediate = true,
    configurationPid = "[com.mycompany.ws.rest,com.mycompany.endpoints]",
    configurationPolicy = ConfigurationPolicy.REQUIRE
) 
public class TestImpl implements Test {
    // ...
}

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

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

谢谢!

【问题讨论】:

    标签: java osgi declarative-services


    【解决方案1】:

    我认为使用 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。

    【讨论】:

    • 谢谢,它有效。我认为要解决您在上一句中强调的问题,只要 TestComponent 从 Config Admin 收到所有预期的配置条目,手动注册实际服务就足够了,对吧?
    • 不知道你的具体情况,但我想是的。请记住,SCR 会自动导出您实现的服务,因此您可能还需要在注释中添加 service= 以防止自动导出服务接口。
    • 知道了。非常感谢
    • 几句话。对每个 pid 调用一次更新。您可以使用 key service.pid 检查查找字典中的哪个 pid。如果使用共享包 pid,请确保您的配置位置设置为 null 或“?”;如果没有更新可能不会被调用。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      较新的版本解决了这个问题...

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

      112.13.4.11 String[] configurationPid default "$" □ 该组件配置的配置PID。

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

      如果没有指定值,则使用该组件的名称作为 该组件的配置PID。

      可以使用一个特殊的字符串(“$”)来指定 组件作为配置PID。 NAME 常量拥有这个特殊的 细绳。例如:

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

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

      自从 1.2

      【讨论】:

        猜你喜欢
        • 2022-07-19
        • 1970-01-01
        • 1970-01-01
        • 2019-03-11
        • 2022-10-06
        • 1970-01-01
        • 2020-10-28
        • 2016-10-28
        • 1970-01-01
        相关资源
        最近更新 更多