2

Neil Bartlett 的文章http://njbartlett.name/2010/07/19/factory-components-in-ds.html展示了在不使用托管服务或托管工厂的情况下为捆绑软件设置配置的方法。

搜索实际设置此方法配置的示例,指向 felix 文件安装或使用托管服务的示例。

回答OSGi 声明式服务与 ManagedService 配置服务的问题?Neil Bartlett 指出“请注意,DS 从未真正为您的组件创建 ManagedService 或 ManagedServiceFactory。它通过使用 ConfigurationListener 侦听 Config Admin 来工作。但是内部细节并不重要......只需使用与 component.name 匹配的 PID/factoryPID 创建配置它“正常工作”

我认为该技术涉及在配置字典中放置一个 pid 条目,但我不知道如何将其与配置管理员一起使用。

有关如何使用此方法设置配置的指南或简单示例将非常有帮助。

4

1 回答 1

1

ManagedServiceFactory我知道这个问题已经有一段时间了,但是当我尝试使用声明式服务创建一个类似的组件时遇到了同样的问题。所以我想分享我的解决方案。也许其他人觉得它有用。我的问题是这样的:

我已经定义了一个组件(用 注释@Component)。在我使用 felix 文件安装添加的每个配置中,我想要使用给定配置创建并立即激活该组件的实例。

首先,我尝试弄乱 和 的属性factoryconfigurationPid@Component所有这些都不需要,甚至返回错误的结果(maven 插件中的 felix 注释处理器在处理 configurationPid 时似乎有一个错误)。

我想出的解决方案:

package com.example.my;

@Component(
    name = MyExampleComponent.FACTORY_PID,
    configurationPolicy = ConfigurationPolicy.REQUIRE,
    property = {"abc=", "exampleProp="}
)
public class MyExampleComponent {

    public static final String FACTORY_PID = "com.example.my.component";

    @Activate
    protected void activate(BundleContext context, Map<String,Object> map) {
        // ...  
    }
}

然后我为 felix file-install 创建了一个配置文件,名为com.example.my.component-test1.cfg

abc = Hello World
exampleProp = 123

部署后,它会自动在配置文件夹中创建一个文件夹结构,例如com/example/my/component包含文件:

factory.config

内容:

factory.pid="com.example.my.component"
factory.pidList=[ \
  "com.example.my.component.525ca4fb-2d43-46f3-b912-8765f639c46f", \
  ]

.

525ca4fb-2d43-46f3-b912-8765f639c46f.config

内容:

abc="Hello World"
exampleProp="123"
felix.fileinstall.filename="file:/..._.cfg"
service.factoryPid="com.example.my.component"
service.pid="com.example.my.component.525ca4fb-2d43-46f3-b912-8765f639c46f"

525ca4fb-2d43-46f3-b912-8765f639c46f似乎是一些随机生成的 ID(可能是 UUID)。

于 2016-09-21T09:19:30.723 回答