2012-06-14 13 views
13

Tengo un paquete OSGi con servicio de persistencia (usando hibernate) y un fragmento, que contiene la configuración (archivo xml). En activador del paquete, estoy cargando la configuración usando:¿Cuándo se adjunta un fragmento OSGi al host?

@Override 
public void start(BundleContext ctx) { 
    URL url = ctx.getBundle().getResource("hibernate.cfg.xml"); 
    SessionFactory sessionFactory = new AnnotationConfiguration().configure(url).buildSessionFactory(); 
} 

pero a veces, la URL es nulo. Cuando traté de enumerar todos los URL disponibles (usando el método findEntries), parecía que los propios del paquete siempre estaban disponibles, pero los fragmentos solo algunas veces. Estoy usando Felix 4.0.2, el paquete y el fragmento se inicia en el mismo Felix. nivel auto.start

Respuesta

22

Los fragmentos se conectan al host en el momento en que se resuelve el host . Normalmente, el fragmento se adjuntará siempre que se instale antes de que el host resuelva.

Sin embargo, siempre existe la posibilidad de que el host se resuelva sin el fragmento, ya que los hosts no dependen de sus fragmentos. Por lo tanto, normalmente debe escribir su host para que pueda hacer frente al fragmento que no está presente, es decir, no debe lanzar NPEs.

Desde OSGi R4.3 puede introducir una dependencia del host en su fragmento utilizando el Require-Capability y Provide-Capability encabezados. Al inventar su propio espacio de nombres para la dependencia, puede hacer que su fragmento lo proporcione con Provide-Capability. Entonces su host puede requerirlo con Require-Capability .... ahora el framework OSGi se asegurará de que el fragmento debe estar disponible antes de que resuelva el host.

+0

¡Gracias, la capacidad de requerir/proporcionar funciona perfectamente! – Kojotak

+0

Eso es práctico. Nunca he visto realmente que el caso de uso falle (utilizamos Equinox), pero no me di cuenta de que no podría resolver el fragmento "a tiempo". Bueno saber. – Robin

+3

Deseo que StackOverflow me permita suscribirme a los usuarios solo para poder leer todo lo que publica Neil. :-) ¡Aprendo algo nuevo casi cada vez que responde! –

0

El fragmento se adjunta al host durante el proceso de resolución del paquete de fragmentos. El host se resuelve y puede iniciarse correctamente incluso si el fragmento no está allí; pero el fragmento depende del host; puede resolverse y luego iniciarse solo después de que esté conectado al host.

Al tener ambos paquetes con el mismo nivel de inicio, parece que ha creado condiciones de carrera para estos dos paquetes. El marco comienza a resolver e iniciar ambos paquetes al mismo tiempo. Algunas veces logra iniciar el paquete de host antes de que el proceso de resolución del fragmento haya finalizado -> entonces el método de inicio del paquete de host se comporta como si no hubiera ningún fragmento disponible.

Lo que puedes hacer es, por ejemplo, para darle al fragmento un nivel de inicio más temprano que el del paquete de host. El fragmento debería resolverse e iniciarse correctamente incluso si el paquete del host aún no se ha iniciado. Solo necesita que el paquete del host se resuelva.

También puede probar este comportamiento en otros marcos OSGi, p. en ProSyst's mBedded Server (mBS) - Sé que es totalmente compatible con la especificación 4.2 de OSGI donde se especifica la resolución de fragmentos anterior.

+0

¡Gracias por la aclaración! Lamentablemente, no está funcionando. Establecí el nivel de felix.auto.start para que el fragmento sea más bajo que para el paquete en sí. Lo he comprobado dos veces en la consola gogo: el paquete tiene un nivel más alto que el fragmento. Siento que el nivel de inicio no garantiza que el paquete/fragmento con nivel inferior termine su resolución antes de pasar al nivel de inicio más alto. – Kojotak

+4

Esto es incorrecto. Primero, el fragmento se adjunta en el momento en que se resuelve el * host *. En segundo lugar, el marco no se resuelve y comienza al mismo tiempo. De hecho, el inicio no tiene ningún impacto en la resolución, y los fragmentos no se pueden iniciar de todos modos. –

Cuestiones relacionadas