2011-07-16 18 views
5

Intento aprender cómo funciona el osgi. Escribí mi primer paquete de hello-world, que da algunos resultados de consola cuando se ejecuta el método de inicio de la clase de activador de paquete. Ahora, he leído sobre el mecanismo de inicio lento y puse esta bandera en mi manifiesto de paquete. luego, inicié la consola Equinox, instalé mi paquete y lo inicié. pero ahora esperaba que mi paquete se marcara como 'inicio'. pero en su lugar, ya llama a su método de inicio y se marca como activo. ¿He entendido algo mal con el mecanismo de arranque perezoso?pregunta del ciclo de vida del paquete osgi

Respuesta

8

El indicador de inicio diferido se utiliza cuando tiene otros paquetes que dependen de su paquete y de las clases de su paquete.

Digamos que tienes dos paquetes A y B, donde

  • A exporta la clase C
  • B depende de A
  • B contiene una clase D que hace referencia C

Lo sucede cuando el paquete B está activado?

Sin bandera de carga lenta, el paquete A se carga y se activa primero.

Con la bandera lazy-carga, la Un haz no se carga o se activa hasta que la clase D tiene que referirse a la clase C.

que puede hacer una diferencia muy grande en el perfil de activación, como la carga y activación de los paquetes se posponen para que ocurran lo más tarde posible con la bandera de carga lenta, por lo que la respuesta inicial del paquete es muy rápida ...

Por el contrario, esta bandera también lo convierte en un agujero mucho más Es difícil razonar sobre el tiempo de ejecución de los métodos en B ya que esto puede ser interceptado con carga y activación de paquetes en cualquier momento ...

+0

¡Muchas gracias a los dos! Esto no se ha explicado muy bien en mi libro, pero ahora lo entiendo :-) – July

3

Dijiste que ya habías iniciado tu paquete después de la instalación: si inicias tu paquete manualmente, se activa independientemente de la política de activación diferida.

Según the OSGi specification lo siguiente es cierto para la activación:

Una política de activación perezoso indica que el paquete, una vez iniciado, debe no se activará hasta que una clase se carga desde ella; ya sea durante la carga normal de la clase o mediante el método Bundle loadClass. La carga de recursos no activa la activación. Este cambio de la política de activación impaciente predeterminada se refleja en el estado del paquete y sus eventos . Cuando se inicia un haz utilizando una política de activación perezoso, se deben tomar las siguientes etapas: se crea

  • A Bundle Contexto para el lote.
  • El estado del paquete se mueve al estado INICIO.
  • El evento LAZY_ACTIVATION se desencadena.
  • El sistema espera que se produzca una carga de clase del paquete.
  • Se inicia el evento STARTING normal.
  • El paquete está activado.
  • El estado del paquete se mueve a ACTIVE.
  • El evento STARTED se desencadena.

Si la activación falla porque el paquete Activador empezar método ha lanzado una excepción, el paquete debe ser detenido sin llamar al método stop Paquete Activador . Estos pasos se muestran en un diagrama de flujo en la Figura 4.29. Este diagrama de flujo también muestra la diferencia en la política de activación de la activación impaciente normal y la activación floja.

actualización: ya que no puedo decir qué versión de la especificación he abierto en el momento en que escribí la respuesta (sin embargo, creo, que era o 4.2 o 4.3), he comprobado la corriente, v5 .0 especificación, y la sección 4.4.6.2 contiene el lugar real, semánticamente equivalente.

+1

Debe presentar la fuente de la especificación. Las especificaciones pueden cambiar con el tiempo y los futuros lectores (como yo) no saben dónde y de qué versión obtuviste esa cita. –

+1

Gracias por el comentario; He agregado referencias a la especificación. –

Cuestiones relacionadas