有没有一种方法可以获取在JVM中运行的所有Spring应用程序上下文的列表?

8
我希望能够获取正在运行在我的servlet容器中的web应用程序的所有Spring应用程序上下文列表。这样我就可以重新初始化这些上下文,而无需重新启动或重新加载我的容器或web应用程序。
这是否可能?如果可以,如何实现?是否有办法通过Servlet API获取运行在servlet容器实例上的所有servlet上下文的列表?

你为什么想这样做?也许还有其他可行的解决方案... - Arne Burmeister
经过一番思考,我意识到我的想法是错误的。我想要做的是能够修改一些外部配置并重新加载所有或部分Spring bean,而不必重新启动我的应用程序。相反,我将把我的应用程序上下文公开为JMX bean。 - Ricardo Gladwell
4个回答

3

[编辑:这并没有帮助,因为每个web.xml都必须具有相同的侦听器]

您可以使用ServletContextAttributeListener监听标准的WebApplicationContext属性插入,并通知一些集中的监视器?

未经过测试:

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
}

谢谢您的提示,我应该能够在所有我的Web应用程序中包含相同的监听器。 - Ricardo Gladwell

3

不行 - 对于这两个问题都不行。

访问所有servlet上下文将是一个安全问题。您将能够检查和/或操作其他Web应用程序。唯一知道所有servlet上下文的是容器本身。但这是内部实现,没有api可用。

Spring上下文访问类似,但如果您指的是一个webapp中的所有spring上下文,则它们将创建一个层次结构 - 例如控制器的上下文。在根Spring上下文中(由配置在web.xml中的org.springframework.web.context.ContextLoaderListener初始化)作为bean实现org.springframework.context.ApplicationListener可以通知您有关启动、停止、关闭或刷新的上下文信息。


1
Tomcat中的管理Web应用程序使用自定义的Catalina API列出和控制其他Web应用程序/Servlet上下文。我认为其他应用程序可以使用此API类似地规避安全性,但我希望找到一个不使用Catalina API的解决方案。 - Ricardo Gladwell
您不能使用Catalina API来实现一个Web应用程序,以供其他应用服务器如WebSphere、Trifork、Oracle或Jetty使用。 - Arne Burmeister

1

0

曾经有一个方法叫做[getServlets](http://java.sun.com/products/servlet/2.2/javadoc/javax/servlet/ServletContext.html#getServlet(java.lang.String)),但是现在已经被弃用了,没有任何替代方法,这意味着拥有这样的方法可能会使实现规范过于繁琐。从规范的JavaDoc中可以看到:

getServlets

public java.util.Enumeration getServlets()

已弃用。自Java Servlet API 2.0起,没有替代方法。

此方法最初定义为返回此servlet上下文中已知的所有servlet的枚举。在此版本中,此方法始终返回一个空枚举,并仅保留二进制兼容性。此方法将在未来的Java Servlet API版本中永久删除。

您的容器可能实现了类似的方法,但它是非标准的,您需要深入研究其文档或告诉我们您正在使用哪个容器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接