2011-10-21 11 views
6

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

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

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

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

Как документация spring, так и 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 

конфигурации: 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 
+0

Я пробовал это с использованием Spring, и свойства были загружены должным образом из файла конфигурации в мою службу с использованием метода setter ... Мне даже не пришлось помещать тег свойства. Я бы использовал Spring, затем , но я не могу выполнять служебные свойства с помощью Spring :(... Spring # OSGI-747. Почему нет ни одной рабочей реализации этого. –

+0

Я пробовал DS для этого, и, похоже, он работает. –

ответ

0

Я считаю, вы должны добавить одну дополнительную строку в вашем управляемых составным элементом.

<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, начинающиеся с сервиса: xxx будут переданы свойствам службы.

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

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