OSGi捆绑配置没有托管服务或工厂

时间:2013-03-08 10:56:31

标签: osgi

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

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

回答问题OSGi Declarative Services vs. ManagedService for configuring service? Neil Bartlett表示“请注意,DS实际上从未为您的组件创建ManagedService或ManagedServiceFactory。它通过使用ConfigurationListener监听Config Admin来工作。但内部细节并不重要。只需使用与component.name匹配的PID / factoryPID创建配置,它就“正常工作”

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

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

1 个答案:

答案 0 :(得分:1)

我知道问题被问到已经过了一段时间,但在尝试使用Declarative Services创建ManagedServiceFactory - 类似的组件时遇到了同样的问题。所以我想分享我的解决方案。也许其他人觉得它很有用。我的问题是这样的:

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

首先我尝试弄乱factory的{​​{1}}和configurationPid属性,但所有这些都不需要甚至返回错误的结果(maven插件中的felix注释处理器似乎有处理configurationPid时的错误。

我提出的解决方案:

@Component

然后我为名为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文件安装创建了一个配置文件:

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" 似乎是一些随机生成的ID(可能是UUID)。