java - Aries managed-service-factory 是否也管理属性?

标签 java apache osgi blueprint aries

我在 Servicemix 4.3.1 中使用 Apache Aries 0.2 并创建了一个 cm:managed-service-factory。使用 .cfg 文件创建服务工作正常(#ARIES-584 除外),但 .cfg 文件中的属性不会注入(inject)到服务对象中。它们确实在 ConfigAdmin 中得到了正确设置,只是我的 bean setter 方法永远不会为我的配置文件中的值调用。

我在想我也许应该使用 cm:managed-properties 或嵌套在我的托管服务工厂中的类似东西,但这需要一个单独的 pid,所以看起来不对。

如果我不放入属性标签,则不会设置任何值。使用属性标签,则只会设置默认值,而不会设置实际的配置文件值。

除了 blueprint-sample.xml 之外,我找不到任何有关使用 Aries CM 子项目的文档。 ,它不显示托管服务工厂内的托管属性。我真的一直在尝试使用 Servicemix,但到处都缺少文档、损坏或缺少功能,或者影响核心功能的错误。

springgemini文档表明他们的托管服务工厂实现也应该作为托管属性。


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>

IFoo.java

package my;
public interface IFoo {
  public String getName();
  public void setName(String name);
}

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;
  }
}

我的.msf-1.cfg

name=name1

我的.msf-2.cfg

name=name2

系统输出

name set to default
name set to default

配置: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

最佳答案

我认为您必须在托管组件元素中添加一行。

<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>

默认值确实会被您的 cfg 文件中的任何内容覆盖。如果重要,将调用默认属性值 setter ,然后调用具有来自 cfg 的值的相同属性 setter 。

在这种情况下,我使用了容器管理的更新策略。但是您可以使用组件托管。

这对我来说似乎有点多余,而且品味很差。为什么我需要在我的 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>

关于java - Aries managed-service-factory 是否也管理属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7851493/

相关文章:

maven-pax-provision + equinox : java. lang.Long 无法转换为 java.lang.String

java - 不确定为什么这个单元测试有效。 Spring ConfigurationContext 更新或创建新对象?

java - Nest 聚合搜索请求

java - 如何在 Apache HttpRequestHandler 中连接完成时执行代码

java - 如何运行多个相互依赖的maven模块

java - 用于 DB2 的 Domino OSGI 驱动程序插件

java - 尝试设置一个非常简单的 Android Google map w/Cluster 但什么也没有显示

java - 在 Java 中启用英特尔超线程

java - 使用 Java 中的 POI 从 Excel 文件读取和写入值需要哪些 jar 文件?

java - 如何使用 POI api 在 Java 中访问受密码保护的 Excel 工作簿