Pregunta

Estoy teniendo un problema de descubrir los servicios que son proporcionados por algunos paquetes OSGi que no se hayan activado. Permítaseme describir la situación:

  • Bundle A define la interfaz X
  • Bundles B, C, y D proporcionan servicios que implementan la interfaz X
    • servicios de estos haces están registrados a través del resorte DM, por lo que sólo se crean cuando el haz se activa y la primavera DM inicializa el contexto de aplicación definido en el haz
  • Lote A se activa y en algún momento le pregunta al registro de servicios para los servicios para la interfaz X. No se encontró ninguna, porque lía B, C, y D no se han movido en el estado ACTIVO (que sólo se resuelven ).

Me parece que no puede conseguir paquetes B, C o D para iniciar, y por lo tanto registrar sus servicios. Obligándolos a comenzar añadiéndolos a la config.ini no es una opción, porque no puede haber cualquier número de paquetes que se instalan en la aplicación (a través de un mecanismo de actualización de Eclipse-p2 similares) que implementan la interfaz X.

La aplicación es una aplicación RCP a base de 3,5 Eclipse, utilizando Spring 2.5.6 y primavera DM 1.2.1.

¿Cómo fuerzo estos manojos para ser activados?

¿Fue útil?

Solución

Lo que realmente tiene es un problema de la jerarquía de dependencia, su solución hacky propuesto es en realidad sólo una tirita sobre la cuestión de fondo.

Lo que realmente debe considerar es la arquitectura de su sistema, como efectivamente lo que tienes es una dependencia circular (re: la discusión en los comentarios de su puesto original). Que tiene (nos guste o no) A requiere los servicios de (y en cierto sentido, depende) B y C. Mientras tanto, B y C dependen directamente de A, y como tal, no puede pondrán en marcha hasta viene arriba.

En el mejor de los casos, puede escribir código en B y C para escuchar la existencia de una, pero esto en el mejor de máscaras (como he mencionado) la cuestión de fondo. Lo que realmente debe considerar es la división de una en dos paquetes, llamémosles A1 y A2.

A1 debe proporcionar la interfaz que B y C requieren (depende). A2 debe tener oyentes para el servicio B y C dependen. En el inicio, si B y C son los servicios requeridos, se debe ejecutar A1, A2, pero puede empezar en cualquier momento posterior, y todo debería funcionar.

Otros consejos

Creo que he encontrado la solución a este problema, aunque se siente un poco hacker.

este hilo donde Adrian Colyer impliqué que un externo "vigilante paquete" podría ser responsable de la activación de paquetes cuando se instalan en el marco.

Por lo tanto, mi solución fue:

  • Añadir un encabezado personalizado para agrupar B, C, y respectivos manifiestos D's, por ejemplo, "MyApp-AutoStart: true"
  • Crear un oyente paquete que responde cuando un paquete se mueve en el estado resuelto y busca la cabecera
  • Si el valor de la cabecera es "verdadero", el oyente llama paquete bundle.start()

El uso de este método, los paquetes que quiero ser iniciado se inician sin tener que recurrir al uso de config.ini, y pueden entrar y salir cuando les plazca, pero sus servicios están disponibles cuando se les pregunta.

También echar un vistazo a FileInstall Felix, que vigila un directorio de paquetes e instala automáticamente y los inicia. Cuando se elimina un archivo, el haz se detuvo y se desinstala también.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top