Управляет ли завод Овен управляемый сервис также свойствами? - PullRequest
6 голосов
/ 21 октября 2011

Я использую Apache Aries 0.2 в Servicemix 4.3.1 и создаю cm: managed-service-factory.Создание сервисов с файлами .cfg работает нормально (за исключением # ARIES-584 ), но свойства из файла .cfg не вводятся в объект сервиса.Они настроены правильно в ConfigAdmin, просто мои методы установки бинов никогда не вызываются для значений в моем файле конфигурации.

Я подумал, что, возможно, мне следует использовать cm: managed-properties или что-то подобное, вложенное в мойmanaged-service-factory, но для этого потребуется отдельный pid, поэтому это не так.

Если я не добавлю тег свойства, тогда никакое значение не будет установлено.С помощью тега свойства устанавливается только значение по умолчанию, но не фактическое значение файла конфигурации.

Я не могу найти никакой документации по использованию подпроекта Aries CM, за исключением blueprint-sample.xml , который не показывает управляемые свойства внутри фабрики управляемых сервисов.Я действительно пытался использовать Servicemix, но на каждом шагу отсутствует документация, сломанные или отсутствующие функции или ошибки, которые влияют на функциональность ядра.

Обе пружина и В документации gemini указано, что их реализации фабрики управляемых сервисов также должны функционировать как управляемые свойства.


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

my.msf-1.cfg

name=name1

my.msf-2.cfg

name=name2

System.out

name set to default
name set to default

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

1 Ответ

0 голосов
/ 20 октября 2014

Полагаю, вам нужно добавить одну дополнительную строку в элементе управляемого компонента.

<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. Если это имеет значение, то будет вызван установщик значения свойства по умолчанию, а затем тот же установщик свойства со значением из cfg.

В этом случае я использовал управляемый контейнером для стратегии обновления. Но вы можете использовать компонент управляемый.

Это кажется излишним для меня и с плохим вкусом. Зачем мне устанавливать другие управляемые свойства внутри моего компонента с пустым постоянным идентификатором, если я уже сделал это выше? Может быть, есть лучший способ, но это похоже на работу.

Кроме того, не существует очевидного способа повлиять на рекламируемые свойства службы. Например, нам может потребоваться соглашение о том, что любые свойства cfg, начинающиеся с service: xxx, будут передаваться в свойства Service.

Обновление: тесты Apache Aries очень полезны. Их можно найти здесь http://aries.apache.org/downloads/currentrelease.html. В частности, обратите внимание на один из них для управления конфигурацией, org.apache.aries.blueprint.cm. В тестовой папке есть несколько примеров. Он показывает, что в дополнение к дочернему элементу cm: managed-properties в показанном выше cm: managed-компоненте также имеется возможность иметь элемент cm: cm-properties в свойствах службы.

<service-properties>
    <entry key="key" value="foo3" />
    <cm:cm-properties persistent-id="" update="true"/>
</service-properties>
...