2009-12-21 13 views
8

Actualmente estoy probando osgi (Spring DM) en una nueva aplicación. La aplicación necesita poder escuchar eventos del sistema de archivos. Hoy resolví esto con un simple sondeador basado en el tiempo, pero cuando se lanza Java 7, probablemente quiera reemplazarlo con una implementación basada en NIO2.Diferentes paquetes de osgi con implementaciones de la misma interfaz: ¿dónde ubicar esa inferface?

Hasta ahora estoy viendo tres paquetes, dos para las implementaciones del servicio de archivos y uno para la lógica de negocios que consume uno de los servicios. Las dos implementaciones deberían implementar la misma interfaz, así que mi pregunta es dónde colocar esa interfaz. Al colocar la interfaz en el paquete que contiene la implementación, el servicio dependerá de uno de sus consumidores.

¿Cuál sería la mejor y más parecida manera de Osgi para estructurar esto? Hasta ahora, mi mejor opción es crear un nuevo paquete "api" que defina las interfaces comunes para las implementaciones.

+0

Creo que eres "módulo de API" idea es el camino a seguir. – skaffman

Respuesta

8

Separete api-bundle es probablemente la mejor opción. Le permite reemplazar la implementación del paquete más tarde. Además, con un api-bundle por separado, puede reemplazar en caliente su paquete actual sin necesidad de que el consumidor reinicie también.

Las clases (y las interfaces) se reconocen por su nombre y cargador de clases. Entonces, si coloca la interfaz de servicio en el mismo paquete que la implementación, pierde la capacidad de reemplazar en caliente el paquete en ejecución. Aunque la interfaz tiene el mismo nombre y es idéntica en todos los sentidos, el paquete recién implementado tiene un cargador de clase diferente => el consumidor considera que la nueva interfaz de paquetes desplegados es una nueva clase y sus dependencias ya no se cumplen.

Para obtener más información sobre la compatibilidad de servicios y versiones (ver comentarios): http://wiki.osgi.org/wiki/Service_Compatibility

+3

Además, debe hacer uso de las versiones de paquetes. De esta manera, incluso puede tener diferentes versiones del mismo paquete de API e incluso el mismo servicio implementado en un marco. – akr

+1

Si bien puede hacer eso con OSGi, si tiene versiones diferentes de la misma API, esto dividirá su aplicación en regiones que usen cada versión, y probablemente no puedan cooperar muy bien, ya que tendrán clasificadores incompatibles. Por ejemplo, por defecto, OSGi no hará visibles los servicios que implementan una versión diferente de la API. – Thilo

+0

Eso es correcto. Solo quería señalar que, en este caso, es importante utilizar el control de versiones, por ejemplo, solo se actualiza un paquete (implementación o API). De lo contrario, podría terminar en un lío porque no ve que la API, el paquete de implementación y el paquete de uso no coinciden. ¿Podría explicar a qué se refiere con "cargadores de clase incompatibles"? – akr

Cuestiones relacionadas