场景:
Apache Tomcat 6.0 在 Windows Server 2008 R2 上作为服务启动,使用包装器 (
org.tanukisoftware.wrapper.WrapperStartStop
),该包装器使用 org.apache.catalina.startup.Bootstrap
。在 Tomcat 启动过程中,还会启动一个 Web 应用程序。
此 Web 应用程序需要连接到远程数据库并检查连接。如果数据库不可用,它会重试连接几次,然后在尝试 x 次后关闭。
问题:
当数据库连接不可用时,我需要在Web应用程序退出后停止Apache Tomcat。
可能的解决方案:
有什么想法吗?也许有不同的方法?
System.exit(0)
将关闭 Tomcat 实例。
在独立服务器上工作,不确定它在作为 Windows 服务运行时是否工作。
编辑:尽管您可能想阅读以下内容:在 Servlet 的 destroy() 方法中调用 System.exit()
当 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 库,只需执行一些反射魔法即可。
好吧,我很确定这是一个不好的方法,但和你一样,我一直无法想出更好的解决方案。
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();
}
这基本上会告诉卡特琳娜自杀。