Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当web应用程序停止时停止ApacheTomcat_Tomcat_Tomcat6 - Fatal编程技术网

当web应用程序停止时停止ApacheTomcat

当web应用程序停止时停止ApacheTomcat,tomcat,tomcat6,Tomcat,Tomcat6,场景: Apache Tomcat 6.0在Windows Server 2008 R2上作为一项服务启动,使用的是一个包装器(org.tanukisoftware.wrapper.wrapper-startstop),它使用的是org.Apache.catalina.startup.Bootstrap。在Tomcat启动过程中,还启动了一个web应用程序。 此web应用程序需要连接到远程数据库并检查连接。如果数据库不可用,它会重试连接几次,然后在x次尝试后关闭 问题: 当数据库连接不可用时,我

场景:

Apache Tomcat 6.0在Windows Server 2008 R2上作为一项服务启动,使用的是一个包装器(
org.tanukisoftware.wrapper.wrapper-startstop
),它使用的是
org.Apache.catalina.startup.Bootstrap
。在Tomcat启动过程中,还启动了一个web应用程序。 此web应用程序需要连接到远程数据库并检查连接。如果数据库不可用,它会重试连接几次,然后在x次尝试后关闭

问题:

当数据库连接不可用时,我需要在webapp退出后停止apachetomcat

可能的解决方案:

  • 从web应用程序中停止Apache Tomcat(已尝试关闭端口,该端口因连接被拒绝而无法工作-使用独立的java应用程序工作)
  • 从web应用程序中调用外部Java应用程序
  • 将ApacheTomcat配置为在唯一的web应用程序关闭时关闭—我找不到这样做的方法
有什么想法吗?也许是另一种方法

问候


Alexander

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

请参阅Javadoc:


如果你不想依赖Tomcat libs,那就做一些反射魔法吧。

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

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();
}
这基本上会告诉Catalina自杀。

系统。如果没有配置安全管理器,则从webapp中退出(0)
将关闭Tomcat实例

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


编辑:虽然您可能想阅读以下内容:

我已经考虑过了,但是当我在webb应用程序中时,如何获取引导对象?在web应用程序之外,我不知道db连接不起作用。正如我提到的,只需在运行的web应用程序中使用静态main方法-org.apache.catalina.startup.Bootstrap.main(新字符串[]{“stop”}),它就不起作用了!可以调用引导对象,但会引发异常(“连接被拒绝”)。我知道它可以从不同的Java进程中工作,但我想避免调用外部应用程序。