Joh*_*ood 6 java apache osgi blueprint aries
我在Servicemix 4.3.1中使用Apache Aries 0.2并创建cm:managed-service-factory.使用.cfg文件创建服务工作正常(#ARIES-584除外),但.cfg文件中的属性不会注入服务对象.它们确实在ConfigAdmin中正确设置,只是我的bean setter方法永远不会调用我的配置文件中的值.
我以为我应该使用cm:托管属性或类似嵌套在我的托管服务工厂中的东西,但这需要一个单独的pid,所以似乎不对.
如果我没有放入属性标记,则不会设置任何值.使用属性标记,然后只设置默认值,但从不实际配置文件值.
我找不到任何使用Aries CM子项目的文档,但blueprint-sample.xml除外,它没有在托管服务工厂内显示托管属性.我一直在尝试使用Servicemix,但是在每个角落都缺少文档,功能损坏或丢失,或者影响核心功能的错误.
无论是春季和双子座的文件表明,他们的托管服务工厂实现也应作为管理的属性.
foo.xml:
<blueprint>
<cm:managed-service-factory id="myfoo-msf" factory-pid="my.msf" interface="my.IFoo">
<cm:managed-component class="my.Foo">
<property name="name" value="default />
</cm:managed-component>
</cm:managed-service-factory>
</blueprint>
Run Code Online (Sandbox Code Playgroud)
IFoo.java
package my;
public interface IFoo {
public String getName();
public void setName(String name);
}
Run Code Online (Sandbox Code Playgroud)
Foo.java
package my;
public class Foo implements IFoo {
private String name;
public void setName(String name) {
this.name = name;
System.out.println("name set to: " + name);
}
public String getName() {
return name;
}
}
Run Code Online (Sandbox Code Playgroud)
my.msf-1.cfg
name=name1
Run Code Online (Sandbox Code Playgroud)
my.msf-2.cfg
name=name2
Run Code Online (Sandbox Code Playgroud)
System.out的
name set to default
name set to default
Run Code Online (Sandbox Code Playgroud)
配置:proplist变种
service.pid = my.msf.xxxxxxx-xx-xx-xxxxxxxxxxxxxxx
name = name1
service.factoryPid = my.msf
service.pid = my.msf.yyyyyyy-yy-yy-yyyyyyyyyyyyyyy
name = name2
service.factoryPid = my.msf
Run Code Online (Sandbox Code Playgroud)
我相信您必须在托管组件元素中添加一行。
<blueprint>
<cm:managed-service-factory id="myfoo-msf" factory-pid="my.msf" interface="my.IFoo">
<cm:managed-component class="my.Foo">
<cm:managed-properties persistent-id="" update-strategy="container-managed"/>
<property name="name" value="default />
</cm:managed-component>
</cm:managed-service-factory>
</blueprint>
Run Code Online (Sandbox Code Playgroud)
默认值确实会被覆盖 cfg 文件中的任何内容。如果重要的话,将调用默认属性值设置器,然后调用具有 cfg 中的值的相同属性设置器。
在本例中,我使用容器管理的更新策略。但您可以使用组件管理。
这对我来说似乎有点多余,而且品味很差。当我在上面已经这样做时,为什么还需要在我的 bean 中设置另一个具有空白持久 id 的托管属性?也许有更好的方法,但这似乎有效。
此外,没有明显的方法来影响所公布的服务属性。例如,我们可能希望有一个约定,即任何以 service:xxx 开头的 cfg 属性都将传递到服务属性。
更新:Apache Aries 测试非常有帮助。它们可以在这里找到:http://aries.apache.org/downloads/currentrelease.html。特别看一下用于配置管理的 org.apache.aries.blueprint.cm 。在测试文件夹中有一些示例。它表明,除了上面显示的 cm:managed-component 中的 cm:managed-properties 子元素之外,还可以选择在 service-properties 中包含 cm:cm-properties 元素。
<service-properties>
<entry key="key" value="foo3" />
<cm:cm-properties persistent-id="" update="true"/>
</service-properties>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2133 次 |
| 最近记录: |