2009-01-06 15 views
5

En Java, puedo agregar cosas dinámicamente a classpath y cargar clases (significando "dinámicamente" sin reiniciar mi aplicación). ¿Existe un marco/biblioteca conocido que se ocupe de la carga/descarga dinámica de módulos sin reiniciar?Carga dinámica de módulos en Java

La configuración habitual, especialmente para aplicaciones web, es equilibrador de carga, varios casos de aplicación, y el despliegue gradual y el reinicio de la nueva versión. Estoy buscando algo más: aplicación con varios servicios/complementos, posiblemente una aplicación de escritorio de instancia única, donde la desactivación de un solo servicio es barata, pero no es posible cerrar o reiniciar la aplicación completa.

estoy pensando en la infraestructura complemento típico, donde los plugins se pueden actualizar o instalar sin necesidad de reiniciar la aplicación. ¿Tengo que programar eso desde cero o algo ya está disponible? Compatible con Spring y opensource es un plus, pero no es un requisito.

Respuesta

9

Puede considerar ejecutar su aplicación de resorte en un OSGI framework.

Creo que el DMServer es un servidor de aplicaciones Java basado en el módulo que está diseñado para ejecutar aplicaciones Java empresariales y aplicaciones de primavera-alimentado, basado en OSGI

Puede encontrar más detalles en este Hello, OSGi, Part 2: Introduction to Spring Dynamic Modules artículo, en particular, cómo utilizar Spring DM para instalar, actualizar y desinstalar módulos dinámicamente en un sistema en ejecución.


Nota: cuando se habla de "plugins pueden ser actualizados o instalados sin necesidad de reiniciar la aplicación", OSGI es el primer marco candidato que viene a la mente.

Se trata de la modularización de aplicaciones en paquetes más pequeños.
cada paquete es un acoplada herméticamente colección, de carga dinámica de clases, tarros, y archivos de configuración que declaran explícitamente sus dependencias externas (si los hay).

3

Tal vez el método más sencillo es cargar cada plugin con su propio cargador de clases. Luego, descarte el cargador de clases y cree uno nuevo para volver a cargar el complemento. Querrá los métodos init() y destroy() en la API del complemento para permitir una oportunidad de funcionalidad de inicio/cierre.

Esto también tiene la ventaja de aislar los plugins de la otra.

Un URLClassLoader es su punto de partida para esto. La idea general es que proporcione una superclase XxxPlugin que cualquier subclase de complemento. Considere el ejemplo de Applet, que es esencialmente un complemento GUI (o Midlet, etc.).

Cuestiones relacionadas