java osgi serviceloader

java - Cuándo usar ServiceLoader sobre algo como OSGi



(2)

Como se señala, si solo está interesado en el descubrimiento simple de servicios, ServiceLoader es una forma liviana de disociar a los consumidores de los proveedores. Pero no ofrece ninguna ayuda para componer servicios juntos.

Por ejemplo, supongamos que el servicio A necesita usar el servicio B. Esta es una "dependencia del servicio" ... ¿pero qué debería hacer A si B no está disponible? En OSGi podemos arreglar que si B no está disponible, tampoco lo estará A, asumiendo que la dependencia es obligatoria; También podemos soportar dependencias opcionales. Por otro lado, cuando se utiliza ServiceLoader, el servicio A no tiene control sobre su disponibilidad siempre que el JAR que lo contiene esté en la ruta de clase ... por lo que debe proporcionar su funcionalidad incluso en ausencia de los servicios de "back-end" requeridos.

Otra cosa a tener en cuenta con ServiceLoader es tratar de abstraer el mecanismo de búsqueda. El mecanismo de publicación es bastante agradable y limpio y declarativo. Pero la búsqueda (a través de java.util.ServiceLoader) es tan fea como el infierno, implementada como un escáner de ruta de clase que se rompe horriblemente si coloca el código en cualquier entorno (como OSGi o Java EE) que no tenga visibilidad global. Si su código se enreda con eso, luego tendrá dificultades para ejecutarlo en OSGi. Es mejor escribir una abstracción que puedas reemplazar cuando llegue el momento.

Siendo alguien que es alérgico a las dependencias, ¿cuándo usaría algo como OSGi en lugar de java 6 http://java.sun.com/javase/6/docs/api/java/util/ServiceLoader.html (quiero para dejar que los frascos de plugin simplemente se dejen caer en.

(Para su información, esto está en una aplicación de scala, abierta a cualquier sugerencia, ServiceLoader está muy cerca de lo que quiero).


Si ServiceLoader mayoría de sus necesidades, eso indica que está buscando el descubrimiento de servicios a través de la presencia de archivos en la ruta de clase. Eso es solo una pequeña parte de lo que proporciona OSGi.

OSGi le permitirá instalar dinámicamente paquetes, anunciar servicios, revocar anuncios y desinstalar paquetes mientras se ejecuta la aplicación. Además, como consumidor de servicios, puede buscarlos con entusiasmo, filtrando las consultas de predicados, y detectar cuándo van y vienen los proveedores de servicios ofrecidos. Estos paquetes no necesitan estar en la ruta de clases, y pueden proporcionarse de varias formas; Los archivos jar y los "directorios explotados" son los dos que recuerdo.

Por el contrario, ServiceLoader hace solo una cosa: expone fábricas ServiceLoader . Por lo general, creará una interfaz de estilo de fábrica que toma algún argumento para decidir si ese proveedor puede ofrecer el servicio adecuado, como asignar un nombre de conjunto de caracteres dado a un CharsetDecoder . No hay un protocolo formalizado para adquirir y liberar un servicio de dicho proveedor. OSGi formaliza la vinculación y desvinculación de los consumidores a los servicios. El consumidor puede recibir una notificación cuando los nuevos proveedores están en línea, y el proveedor puede recibir una notificación cuando un consumidor adquiere y libera una instancia de servicio. Si este control del ciclo de vida es importante para su servicio y renuncia a OSGi, tendrá que crearlo usted mismo; ServiceLoader no llega tan lejos.

Como alternativa, en lugar de buscar y utilizar el servicio con entusiasmo, puede adoptar un enfoque más pasivo y declarativo y permitir que uno de los gerentes de dependencia de OSGi haga coincidir sus necesidades con los proveedores de servicios disponibles. Hay muchos gerentes de dependencia para elegir. Spring Dynamic Modules es uno de los más capaces.

OSGi proporciona muchas otras facilidades de "middleware". No intentaré venderte aquí, ya que tu pregunta se centra principalmente en lo que te estarías perdiendo al elegir ServiceLoader .