2011-09-01 14 views
9

He estado buscando una solución para crear una aplicación web modular, que sea modular en el sentido de que el usuario puede proporcionar su propio complemento en forma de un simple contenedor que luego proporcionará sus propios datos a mi aplicación web y mi aplicación web será responsable de mostrarlo.OSGI creando aplicación web modular

Ahora el problema es que quiero que mi aplicación web sea lo más genérica posible sin depender del contenedor web j2ee para admitir nada. es decir, no puedo confiar en mi contenedor web para brindar soporte a osgi y desplegar la aplicación web como un paquete de osgi en sí mismo (lo que realmente hace las cosas muy simples, por ejemplo, glassfish y WAS).

Estoy planeando usar Equinox y la única solución que veo actualmente es el puente de servlet que proporcionan en su sitio oficial, pero para mí es realmente un dolor delegar todo a un servlet que a su vez interpretará la solicitud y encontrará una clase de paquete apropiada y, a continuación, volver a comunicar de alguna manera solo los datos a la aplicación web.

Para mí sería maravilloso si mi aplicación web también fuera un paquete. ¿Hay algo cerca de esta solución ideal que pueda probar? ¿O cualquier otro método de comunicación entre los dos relés de osgi y la aplicación web (contenedor)?

Respuesta

5

El OSGi spec detalla el formato WAB (Web Archive Bundle).

Y Pax Web ofrece un gran apoyo para aplicaciones web WAB/WAR (PAX Web funciona muy bien en Equinox, Felix, etc)

utilizando Web pax se obtiene el BundleContext a través de la ServletContext, por ejemplo:

BundleContext bundleContext = (BundleContext) getServletContext().getAttribute("osgi-bundlecontext"); 

Para la capacidad de plug-in accionada por el usuario que menciona, le sugerí que proporcione algunas interfaces de servicio para que implementen los paquetes de complementos y en su aplicación web un ServiceTracker para escuchar su registro (a menos que esté usando los Servicios declarativos). También puede fácilmente install bundles desde un servlet de carga.

Supongo que los usuarios que carguen complementos deberían haber iniciado sesión y haber sido autorizados, por lo que los problemas de seguridad se habrán cumplido en este momento.


EDIT: respondiendo a comentar aquí como no hay suficiente espacio en el campo de comentarios

disculpas, creo que malinterpretado usted pregunta - que haya un contenedor de aplicación Web existente (s) y que desea implementar un WAR con la funcionalidad OSGi? Si ese es el caso, entonces use ServletBridge como otros lo han mencionado o incorpore un marco OSGi en su WAR (esto es relativamente fácil, vea this por ejemplo).

Incluso podría hacer esto opcional al intentar obtener el BundleContext del ServletContext y si esto devuelve un valor nulo, entonces inicie su propio marco incrustado.De esta forma, se ejecutará en un contenedor OSGi nativo (por ejemplo, Glassfish) o en un servidor de aplicaciones Java EE.

De lo contrario, PaxWeb es una implementación de las especificaciones HttpService y WebApp OSGi, pero con muchas extensiones para facilitar la vida, pero usted implementa esto en un contenedor OSGi.

+0

Hola su respuesta es interesante, sé sobre WABs, eso es lo que mencioné en mi pregunta "no puedo confiar en mi contenedor web para brindar soporte a osgi e implementar la aplicación web como un paquete osgi". Pero no estaba al tanto de la red pax, ¿el enlace oficial que me dio sugiere que es una extensión para que Jetty despliegue guerras como wabs? ¿Puedes explicar más? – FUD

+0

gracias, evaluaré el método que sugirió en el enlace. – FUD

1

ServletBridge es para incrustar un contenedor OSGI dentro de un contenedor web. La otra opción es incrustar un contenedor web (como un paquete) en un contenedor OSGI. El siguiente artículo tiene algunos detalles sobre cómo lograr esto.

http://java.dzone.com/articles/osgi-and-embedded-jetty

+0

gracias soy consciente de eso, pero no quiero estar restringido a ningún contenedor web particular y afaik incrustado la mayoría de los servidores no es una opción. – FUD

2

Es posible que desee ver en Apache Sling. Es un marco web que tiene un contenedor OSGi incorporado. El contenedor OSGi se llama Apache Felix y es bastante bueno.

+0

esto se ve bien, pero no quiero estar restringido por lo que admite el marco, por ejemplo, me gustaría usar JSF para mi aplicación web. Tal vez debería haber mencionado eso en mi pregunta. – FUD

1

Es posible que desee probar ChonCMS - http://www.choncms.com

Su arquitectura se basa exactamente en lo que están pidiendo, viene con algunos plugins para habilitar la funcionalidad CMS base, es plataforma modular con el envase de aplicación web dotando de una Felix y complementos se pueden agregar/eliminar en el tiempo de ejecución también.

La desventaja puede ser que tiene falta de documentación, pero puede preguntar, es de código abierto, estoy seguro de que estarán encantados de responder preguntas, y aún mejor puede contribuir, todavía está en fase de incubación.

Cuestiones relacionadas