2011-10-21 18 views
6

Estoy usando Apache Aries 0.2 en Servicemix 4.3.1 y creo un cm: managed-service-factory. La creación de los servicios con archivos .cfg funciona bien (excepto en el #ARIES-584), pero las propiedades del archivo .cfg no se inyectan en el objeto de servicio. Se configuran correctamente en ConfigAdmin, solo mis métodos setter de bean nunca reciben llamadas para los valores en mi archivo de configuración.¿Aries managed-service-factory también administra propiedades?

Estaba pensando que debería usar un cm: managed-properties o algo así anidado dentro de mi fábrica de servicio administrado, pero eso requeriría un pid por separado, por lo que no parece correcto.

Si no coloco la etiqueta de propiedad, no se establece ningún valor. Con la etiqueta de propiedad, solo se establece el valor predeterminado, pero nunca el valor real del archivo de configuración.

No puedo encontrar ninguna documentación para el uso del subproyecto Aries CM, excepto por blueprint-sample.xml, que no muestra las propiedades administradas dentro de una fábrica de servicios gestionados. Realmente he estado tratando de usar Servicemix, pero en cada esquina falta documentación, funciones rotas o faltantes, o errores que afectan la funcionalidad central.

Tanto la documentación de spring como la de gemini indican que las implementaciones de fábrica de los servicios gestionados también deberían funcionar como propiedades administradas.


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

Intenté usar Spring y las propiedades se cargaron correctamente desde el archivo de configuración en mi servicio utilizando el método setter ... Ni siquiera tuve que poner la etiqueta de propiedad. Utilizaría Spring, luego , pero no puedo hacer las propiedades de servicio con Spring :(... Spring # OSGI-747. ¿Por qué no hay una sola implementación de trabajo de esto? –

+0

Intenté DS para esto, y parece que funciona. –

Respuesta

0

creo que usted tiene que añadir una línea adicional en su elemento gestionado por componentes.

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

De hecho, el valor predeterminado se sobrescribirá con independencia de lo que esté en su archivo cfg. Si es importante, se invocará el valor predeterminado de la propiedad setter, seguido del mismo setter de la propiedad con el valor de la cfg.

En este caso, he utilizado la gestión de contenedores para la estrategia de actualización. Pero podrías usar el componente administrado.

Esto parece algo redundante para mí y de mal gusto. ¿Por qué tengo que configurar otras propiedades administradas dentro de mi bean con una identificación persistente en blanco cuando ya lo he hecho anteriormente? Tal vez hay una mejor manera pero parece que funciona.

Además, no hay una forma obvia de afectar las Propiedades del servicio que se anuncian. Por ejemplo, es posible que deseemos tener una convención de que las propiedades de cfg que comiencen con el servicio: xxx pasarán a las propiedades del servicio.

Actualización: Las pruebas de Apache Aries son bastante útiles. Se pueden encontrar aquí http://aries.apache.org/downloads/currentrelease.html. En particular, eche un vistazo a la de gestión de la configuración, org.apache.aries.blueprint.cm. En la carpeta de prueba, tiene algunos ejemplos. Muestra que, además del elemento secundario cm: managed-properties en cm: managed-component que se muestra arriba, también hay una opción para tener un elemento cm: cm-properties dentro de las propiedades del servicio.

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