问题描述
我有一个使用 Apache Felix configadmin、scr 和 fileinstall 的 OSGi 运行时。 Fileinstall 从目录安装配置。我的应用程序使用了许多 DS 组件,这些组件都具有不同的 configurationPid。
当我添加新组件时,配置文件的数量不断增加,但许多文件只有一两个属性。我想摆脱为某个属性编辑哪个文件的先验知识的必要性。因此,我想提供一个允许配置所有属性的单个配置文件的可能性。为此,我的所有组件现在都有一个优先级较低的“公共”pid,即
@Component(configurationPid = {"common",Component.NAME})
如果 fileinstall 的配置文件夹包含一个 common.cfg,则属性优先于我所期望的,即来自 componentName.cfg 的属性优先于common.cfg 中的那些,优先于默认值。
但是,如果没有 common.cfg 存在,则不会使用 componentName.cfg 中的属性,只应用默认值。但是没有通用文件应该没问题,因为专家仍然可以忽略这种可能性并将配置分开。
示例 1:
common.cfg: myProp=a
组件名称.cfg:myProp=b
-> 我的组件按预期使用 b
激活
示例 2:
common.cfg: myProp=a
没有 componentName.cfg
-> 我的组件按预期使用 a
激活
示例 3:
没有common.cfg
组件名称.cfg:myProp=b
-> 我的组件以 myprop 的默认值激活,这是我没想到的。
据我所知 112.6,point 2,规范没有明确提及如何处理缺少优先级较低的 PID 的配置对象的情况。但是从配置管理中检索的配置总是优先于组件描述中的默认值(第 3 点)。
我对 configurationPid 的工作方式的看法以及我的期望属性应该如何优先是错误的吗?观察到的行为是否符合 OSGi 规范?还是 Felix 捆绑包中的一个错误?
我不熟悉 felix-scr 的源代码,但我认为创建组件配置的相关部分在 ConfigurableComponentHolder.mergeProperties 中。实际的配置是使用默认值创建的,然后来自配置管理员的配置以正确的顺序迭代,如果配置存在,则替换以前的属性,如预期的那样。我看不到第一个空配置打破了循环,因此它符合我的预期。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)