2011-10-21 60 views
6

我在Servicemix 4.3.1中使用Apache Aries 0.2並創建了cm:managed-service-factory。使用.cfg文件創建服務可以正常工作(#ARIES-584除外),但.cfg文件中的屬性不會注入到服務對象中。他們確實在ConfigAdmin中正確設置,只是我的bean setter方法永遠不會爲我的配置文件中的值調用。白羊座託管服務工廠是否也管理物業?

我在想我也許應該使用cm:managed-properties或類似嵌套在託管服務工廠內的東西,但這需要單獨的pid,所以看起來不正確。

如果我沒有放置屬性標籤,那麼沒有設置任何值。使用屬性標籤,然後只設置默認值,但從來沒有實際的配置文件值。

我找不到使用白羊座CM子項目的任何文檔,blueprint-sample.xml除外,它不顯示託管服務工廠內的託管屬性。我一直在嘗試使用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; 
    } 
} 

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中的值相同的屬性設置器。

在這種情況下,我使用容器管理的更新策略。但是你可以使用組件管理。

這對我來說似乎有點多餘,而且味道很差。當我已經完成上述操作時,爲什麼需要在我的bean中設置另一個帶有空白持久ID的託管屬性?也許有更好的方法,但這似乎工作。

此外,沒有明顯的方式來影響通告的服務屬性。例如,我們可能希望有一個約定,即任何以service:x​​xx開頭的cfg屬性都將傳遞給Service屬性。

更新:Apache的白羊座測試非常有幫助。他們可以在這裏找到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>