当 Web 应用程序停止时停止 Apache Tomcat

问题描述 投票:0回答:3

场景:

Apache Tomcat 6.0 在 Windows Server 2008 R2 上作为服务启动,使用包装器 (

org.tanukisoftware.wrapper.WrapperStartStop
),该包装器使用
org.apache.catalina.startup.Bootstrap
。在 Tomcat 启动过程中,还会启动一个 Web 应用程序。 此 Web 应用程序需要连接到远程数据库并检查连接。如果数据库不可用,它会重试连接几次,然后在尝试 x 次后关闭。

问题:

当数据库连接不可用时,我需要在Web应用程序退出后停止Apache Tomcat。

可能的解决方案:

  • 从 Web 应用程序中停止 Apache Tomcat(已经尝试了关闭端口,但由于连接被拒绝而不起作用 - 使用独立的 java 应用程序它可以工作)
  • 从 Web 应用程序中调用外部 Java 应用程序
  • 将 Apache Tomcat 配置为在唯一的 Web 应用程序关闭时关闭 - 我找不到方法来做到这一点

有什么想法吗?也许有不同的方法?

tomcat tomcat6
3个回答
1
投票
如果没有配置安全管理器,您的 web 应用程序中的

System.exit(0)
将关闭 Tomcat 实例。

在独立服务器上工作,不确定它在作为 Windows 服务运行时是否工作。

编辑:尽管您可能想阅读以下内容:在 Servlet 的 destroy() 方法中调用 System.exit()


1
投票

当 Tomcat 启动时,您实际上是使用参数

org.apache.catalina.startup.Bootstrap::main
调用
start
。要停止 Tomcat,请使用命令
stop
调用相同的类/方法。您不需要为此使用另一个 Java 进程,只需静态调用
main
方法即可。

参见Javadoc: http://tomcat.apache.org/tomcat-5.5-doc/catalina/docs/api/org/apache/catalina/startup/Bootstrap.html

如果你不想依赖 Tomcat 库,只需执行一些反射魔法即可。


1
投票

好吧,我很确定这是一个不好的方法,但和你一样,我一直无法想出更好的解决方案。

try{
    MBeanServer server = MBeanUtils.createServer();
    ObjectName name = new ObjectName("Catalina:type=Service,serviceName=Catalina");
    server.invoke(name, "stop", new Object[0], new String[0]);
} catch (Exception) {
     e.printStackTrace();
}

这基本上会告诉卡特琳娜自杀。

© www.soinside.com 2019 - 2024. All rights reserved.