2011-04-27 16 views
7

Tengo en mente un sistema inteligente que puede elegir dinámicamente entre los servicios OSGi disponibles. Es decir, elija una implementación u otra dependiendo de algún parámetro de tiempo de ejecución. Por ejemplo, notificar a un algoritmo en ejecución que cambie a un operador después de varias iteraciones, o según el equilibrio de carga en un sistema o lo que sea.¿Cómo elegir en tiempo de ejecución entre varios servicios OSGi de una manera inteligente?

while(stopCriterion){ 
    operator.doSomething(); //There exist many operator implementations 
} 

Mi primer enfoque consiste en utilizar DS para exponer los servicios y enlazar con los servicios 0..n y política dinámica. Luego, desde un componente externo inteligente, notifique al algoritmo qué servicio se usa en cada iteración (usando EventAdmin, ¿quizás?).

operator[selected].doSomething(); 

Esto me podría ayudar a reducir la complejidad cuando se deben ejecutar muchos experimentos con una gran cantidad de diferentes implementaciones de servicios. Además, tengo la intención de utilizar la especificación de servicios remotos con Eclipse Communication Framework para hacer investigación en algoritmos distribuidos y esas cosas, por lo que de forma dinámica aparición de nuevas implementaciones en tiempo de ejecución también podría ser posible

Sin embargo, no sé si es esto una buena idea o existe otro mecanismo mejor para seleccionar dinámicamente qué uso de la implementación. Creo que usar ServiceTracker en cambio DS no es una buena opción, pero estoy abierto a sugerencias :)

Gracias de antemano.

Respuesta

5

Esto me parece un patrón de estrategia, que bien puede implementarse utilizando servicios. Asumiendo que tiene un tipo de servicio llamado Operator (y tienen una interfaz con el mismo nombre), esto funcionaría más o menos así:

  • crear un servicio OperatorProvider, que contiene la funcionalidad necesaria, y alguna información adicional (tal como, cuándo es adecuada esta implementación), y crea una cantidad de instancias de eso, una para cada una de tus estrategias.
  • Cree un servicio selector, que implementa la interfaz Operator, y canaliza todas las llamadas al servicio al OperatorProvider más adecuado. La forma en que este servicio selecciona al proveedor más adecuado es, probablemente, parte de la inteligencia.
  • El usuario real del servicio ahora solo tiene una dependencia de un servicio Operator, y no tiene que preocuparse por la selección del proveedor.

Supongo que puede poner la estrategia de selección en el servicio selector, pero si realmente es un componente externo, puede usar cualquier mecanismo para manejar la comunicación entre el componente inteligente y el selector: una interfaz de servicio , eventos, etc.

+0

Hola Andy. Me gusta su idea de un servicio de selector intermedio para seleccionar la instancia apropiada :) Sin embargo, los desarrolladores de "Operadores" y "Algoritmos" probablemente no estén familiarizados con OSGi, y creo que el Selector podría confundirlos. De todos modos, encontré tu comentario una forma elegante para resolver mi problema. Si nadie me ofrece otra solución, marcaré su respuesta como "marcada" (esta es mi primera pregunta en StackOverflow, no sé si lo he podido comprobar más que una respuesta o modificar mi elección). –

+0

No es necesario que los operadores-implementadores conozcan mucho sobre OSGi, siempre que solo implementen la interfaz correcta. En cuanto a aceptar una respuesta: no creo que puedas revisar tu elección, así que elige sabiamente. (O vea [faq] (http://stackoverflow.com/faq) para obtener más información.) –

+0

Gracias Angelo (¡no Andy!). Su idea es genial porque Selector también puede vincular otros servicios que el "Algoritmo" usa para extraer información :) (Todavía no puedo recomendar su respuesta, necesito más reputación). –

0

supongo, algún tipo de estrategia dinámica patrón o incluso inyección de dependencias podrían adaptarse a sus necesidades. Algunas clases usan una estrategia (lo llamó operador) que puede cambiar en tiempo de ejecución. Creo que tienes otro servicio que puede decir qué estrategia utilizar (en función de los parámetros de tiempo de ejecución).

Una aplicación brusca puede parecerse a lo siguiente:

public Worker { 
    private Operator operator; // your actual operator strategy 
    public void setOperator(Operator actualOperator) { 
    this.operator = operator; 
    } 

    public doSomething() { 

    while(stopCriterion) { 
     Operator operatorForThisIteration = operator; // pick the injected service 
     operatorForThisIteration.doSomething; 
    } 
    } 
} 

y otro servicio, el que puede inyectar dependencias a instancias del trabajador, se mantendrá una lista de todas las instancias del trabajador, aplicar un poco de lógica para elegir un nuevo servicio e inyectar en todos (o algunos) trabajadores.

+0

Hola Andreas. Estoy buscando un acoplamiento flexible usando las capacidades de OSGi. La "inteligencia" debe estar fuera del "Trabajador" (y también opcional), pero no de los trabajadores. No obstante, tomo nota de su idea de usarlo en otros problemas;) –

+0

@Pablo: el acoplamiento es bastante flojo, 'Operator' es una interfaz y no una implementación de servicio ...!? –

Cuestiones relacionadas