2009-02-16 8 views
5

Me gustaría poder obtener una lista de todos los contextos de aplicación de Spring desde las aplicaciones web que se ejecutan en mi contenedor de servlets. Esto para poder reinicializar los contextos sin reiniciar o volver a cargar mi contenedor o webapps.¿Hay alguna manera de obtener una lista de todos los contextos de aplicación Spring que se ejecutan en la JVM?

¿Esto es posible? ¿Si es así, cómo? ¿Hay alguna forma de obtener una lista de todos los contextos de servlet que se ejecutan en una instancia de contenedor de servlet a través de la API de Servlet?

+0

¿Por qué quieres hacerlo? Tal vez haya otras soluciones posibles ... –

+0

Después de pensarlo un poco, me di cuenta de que estaba pensando en esto al revés. Lo que quiero hacer es poder modificar alguna configuración externa y volver a cargar todos o algunos de mis beans de Spring sin reiniciar mi aplicación. En cambio, voy a exponer mis contextos de aplicación como beans JMX. –

Respuesta

2

[Editar: Esto no ayuda, ya que cada Web.xml tendría que tener la misma escucha]

Usted podría tener un ServletContextAttributeListener escuchar a cabo para las inserciones de la norma WebApplicationContext atributo, y luego notificar a algún monitor centralizado?

no han sido evaluados:

public class SpringWACListener implements ServletContextAttributeListener { 
    public void attributeAdded(ServletContextAttributeEvent scab) { 
     if (WebApplicationContext. 
      ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE. 
      equals(scab.getName()) { 
      myCentralisedMonitor.notify("added"); 
     } 
    } 
    // same for others 
} 
+0

Gracias por la sugerencia, debería ser posible incluir el mismo oyente en todas mis aplicaciones web. –

0

No solía ser y se llamó [getServlets] (http://java.sun.com/products/servlet/2.2/javadoc/javax/servlet/ServletContext.html#getServlet(java.lang.String)); sin embargo, se considera obsoleto sin reemplazo es decir, que habiendo un procedimiento de este tipo, probablemente hizo la implementación de la especificación de una carga excesiva Desde el JavaDoc de la especificación:.

getServlets

getServlets java.util.Enumeration públicos()

obsoleto. a partir de Java Servlet API 2.0, sin reemplazo.

Este método se definió originalmente para devolver una enumeración de todos los servlets conocidos por este contexto de servlet . En esta versión, este método siempre devuelve una enumeración vacía y permanece solo para preservar la compatibilidad binaria con . Este método será eliminado permanentemente en una futura versión de de la API de Java Servlet.

Su contenedor puede implementar un método similar, pero no será estándar y tendrá que profundizar en su documentación o decirnos qué contenedor está utilizando.

3

No, en ambas preguntas.

El acceso a todos los contextos de servlets sería un problema de seguridad. Podrías inspeccionar y/o manipular otras aplicaciones web. El único que conoce todos los contextos de servlets es el contenedor en sí. Pero esta es una implementación interna, no hay API.

El acceso al contexto de primavera es similar, pero si se refiere a todos los contextos de primavera en una aplicación web, crearán una jerarquía, por ejemplo, para los controladores. La implementación de un org.springframework.context.ApplicationListener como bean en el contexto del resorte raíz (según lo inicializado por el org.springframework.web.context.ContextLoaderListener configurado en el web.xml) puede notificarlo sobre contextos iniciados, detenidos, cerrados o actualizados.

+0

La aplicación web manager en Tomcat enumera y controla otras aplicaciones web/contextos de servlets utilizando la API de Catalina personalizada. Supongo que otras aplicaciones podrían usar esta API para eludir de forma similar la seguridad, pero me gustaría una solución que no use la API catalina. –

+0

No se puede usar la API catalina para implementar una aplicación web para que sea utilizada por otros servidores de aplicaciones como websphere, trifork, oracle o jetty. –

Cuestiones relacionadas