Pregunta

Una vez que una instancia de un servicio OSGi se recupera a partir del contexto paquete ¿será invalidado cuando se detiene el servicio?

Mis pruebas iniciales muestran que la instancia de servicio se puede utilizar incluso después de que se detiene el paquete de servicios, lo que contradice mi comprensión de la naturaleza dinámica de OSGi.

supongo que esto se reduce a lo que la recuperación de un servicio (a través de ServiceTracker) de otro paquete en el contenedor OSGi en realidad no, tampoco crea una nueva instancia o se le dará un puntero a la instancia que se registra en el contenedor?

¿Hay peligros en el uso de la instancia de servicio después de que el servicio se ha detenido?

¿Fue útil?

Solución

Esta es una pregunta muy buena, así que cavé en la especificación en la búsqueda de una respuesta definitiva. Resulta que hay una sección entera hablando de este problema - véase la sección 5.4 Referencias rancios partir de la página 132 de Servicio OSGi Plataforma especificación principal, versión 4, versión 4.2 .

Para responder a su pregunta de acuerdo a la especificación:

  

El comportamiento de un servicio que se convierte sin registrar no está definido. tales servicios   puede seguir trabajando correctamente o lanzar una excepción a su discreción.

Y para evitar problemas potenciales:

  

Los paquetes deben escuchar a los eventos generados por el Marco para limpiar y eliminar rancio   referencias.

La especificación también da algunos consejos de cómo reducir al mínimo las consecuencias de referencias rancios.

Otros consejos

Tiene usted razón en que es contradictorio a la naturaleza dinámica de OSGi. Creo que no hay ninguna garantía de que el servicio estará disponible, a pesar de las diferentes implementaciones de contenedores y servicios OSGi mismos pueden comportarse de manera diferente.

Por ejemplo, si el servicio fue creado y registrado en la primavera DM, entonces el servicio recuperada es en realidad un proxy basado en la primavera con la aplicación subyacente, y la puesta en práctica todavía puede desaparecer. Por lo tanto una referencia de servicio que se refiere directamente a una implementación puede mantener ese objeto de ser eliminado, mientras que la referencia basado proxy no.

La especificación OSGi dice:

  

Los paquetes son entidades que son visibles   en la programación de aplicación normal. por   ejemplo, cuando un haz se detiene, todo   sus servicios serán registradas.

Así que no debería ser capaz de obtener un servicio de un paquete detenido. Pero técnicamente es posible usarlo, por lo menos mientras se mantiene una referencia al objeto de servicio (nadie se lo puede quitar de usted y que no será GC'd). Pero no creo que se guardar para utilizar el servicio. Esto puede depender de otros recursos del paquete, que no están disponibles después de que el paquete se ha detenido.

  

Una vez que una instancia de un servicio OSGi es   recuperado del contexto haz hace   que se convierta en invalidada cuando el servicio   se detiene?

No, la referencia en sí no se convierte en invalidada. Mientras algo dentro del contenedor es la celebración de ella, puede también no ser GC'ed.

Sin embargo, si es o no será todavía útil, depende sólo de la propia implementación del servicio, no el contenedor.

  

Mis pruebas iniciales muestran que la instancia de servicio se puede utilizar incluso después de que el paquete de servicios> se detiene, lo que contradice mi comprensión de la naturaleza dinámica de OSGi.

Las propias especificaciones indican que tales referencias no deben ser considerados, pero es hasta el implementador para cuidar de la aplicación de las especificaciones correctamente; significa que no hay contradicción, no es sólo el hecho de que se puede implementar y desplegar paquetes que no se comportan correctamente de acuerdo con las especificaciones.

  

supongo que esto se reduce a lo que la recuperación de un servicio (a través de ServiceTracker) de otro paquete   en el contenedor OSGi hace realidad, tampoco crea una nueva instancia o se le dará un puntero   a la instancia que está inscrita en el contenedor?

El contenedor no crea nuevas instancias de los servicios, excepto si hay una ServiceFactory involucrados (ver especificaciones). Mirando hacia arriba un servicio siempre debe darle un puntero a la instancia registrada en el contenedor.

  

¿Hay peligros en el uso de la instancia de servicio después de que el servicio se ha detenido?

Eso sólo depende de la implementación del servicio; Sin embargo, al hacerlo en un paquete, se crea automáticamente un paquete que no se ajusta a las especificaciones.

En la práctica, muchos servicios se implementan para liberar recursos y referencias y no responder adecuadamente por más tiempo.

En cuanto a su pregunta de si es peligroso utilizar una instancia de servicio después de que el servicio se ha detenido. Para citar de la especificación 4.2 de núcleo (5.4 Referencias rancios):

  

El comportamiento de un servicio que se convierte   sin registrar no está definido. Tal   servicios pueden seguir trabajando correctamente   o lanzar una excepción en su   discreción.

No quiero citar toda la sección de la especificación aquí, pero las siguientes frases son una buena discusión sobre el peligro de utilizar referencias rancios:

  

Una referencia rancio es una referencia a un objeto de Java que pertenece   para el cargador de clases de un paquete que se detiene o se asocia   con un objeto de servicio que no está registrado. Java estándar no lo hace   proporcionar cualquier medio genérico para limpiar las referencias obsoletas, y el paquete   los desarrolladores deben analizar su código cuidadosamente para asegurar que rancio   se eliminan referencias.

     

referencias rancios son potencialmente perjudiciales porque obstaculizan el Java   recolector de basura de la cosecha de las clases, y posiblemente los casos,   detenido de paquetes. Esto puede resultar en un aumento significativamente la memoria   el uso y puede causar la actualización de las bibliotecas de código nativo a fallar. fardos utilizando   Se recomienda encarecidamente a los servicios a utilizar el Rastreador de Servicio o   Servicios declarativa.

Una referencia servicio nunca debe mantenerse como referencia. Siempre se debe buscar un servicio en tiempo de ejecución. Esto le ata a la API de OSGi sin embargo, que atraparán no siempre se desea.

Tener un vistazo a - serviceTracker OSGi - servicios declarativos OSGI - BluePrint OSGi - Spring DM - Peaberry - iPojo

la que todos cuidar el dinamismo para usted, la mayoría de ellos sin api OSGi para usar.

Saludos,

Leen Toelen

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