如何从Java代码中停止另一个tomcat(JSP/Servlet)

如何从Java代码中停止另一个tomcat(JSP/Servlet),java,jsp,tomcat,servlets,Java,Jsp,Tomcat,Servlets,我安装了两个Tomcat,如下所示: Tomcat-A{路径:C:\TomcatA,端口:Connector port=“8080” redirectPort=“8443”关闭端口为-1} Tomcat-B{路径:C:\TomcatB,端口:Connector port=“8090” 重定向端口=“8444”关闭端口为8015} 我有一个在Tomcat-a上运行的JSP/Servlet应用程序。我的要求是关闭Tomcat-B并删除/取消部署托管在Tomcat-B上的应用程序。下面是我的Java代

我安装了两个Tomcat,如下所示:

  • Tomcat-A{路径:C:\TomcatA,端口:Connector port=“8080” redirectPort=“8443”关闭端口为-1}
  • Tomcat-B{路径:C:\TomcatB,端口:Connector port=“8090” 重定向端口=“8444”关闭端口为8015}
  • 我有一个在Tomcat-a上运行的JSP/Servlet应用程序。我的要求是关闭Tomcat-B并删除/取消部署托管在Tomcat-B上的应用程序。下面是我的Java代码

    private void StopTomcat() throws Exception {
        if(logger.isDebugEnabled()) logger.debug("StopTomcat");
    
        try {
    
            if (logger.isTraceEnabled())logger.trace("Shutting down tomcat: ");
    
            String Directory = "C:\TomcatB\bin\";
    
            Process process = Runtime.getRuntime().exec(Directory + "shutdown.bat");
    
            if (logger.isTraceEnabled())logger.trace("Executed shutdown.bat at " + Directory );
            
            BufferedReader stdInput = new BufferedReader(new InputStreamReader(process.getInputStream()));
            BufferedReader stdError = new BufferedReader(new InputStreamReader(process.getErrorStream()));
    
            if (logger.isTraceEnabled())logger.trace("Printing shutdown process logs" );
            String s = null;
            while ((s = stdInput.readLine()) != null) {
                if (logger.isTraceEnabled())
                    logger.trace(s);
            }
            String Error = "";
            while ((s = stdError.readLine()) != null) {
                Error = Error + s;
            }
    
            if (!Error.equals("")) {
                logger.error(Error);
                throw new Exception("Tomcat Shutdown Failed with error: " + Error);
            }
            
        } catch (Exception e) {
            e.printStackTrace();
            logger.error( Arrays.toString( e.getStackTrace() ));
            throw new Exception(e.getMessage());
        }
    }
    
    在我的日志中:

    2020-08-04 21:11:00 TRACE MigrateApp:55 - Executed shutdown.bat at C:\TomcatB\bin\
    2020-08-04 21:11:00 TRACE MigrateApp:60 - Printing shutdown process logs
    2020-08-04 21:11:00 TRACE MigrateApp:64 - Using CATALINA_BASE:   "TomcatA"
    2020-08-04 21:11:00 TRACE MigrateApp:64 - Using CATALINA_HOME:   "TomcatA"
    2020-08-04 21:11:00 TRACE MigrateApp:64 - Using CATALINA_TMPDIR: "TomcatA\temp"
    2020-08-04 21:11:00 TRACE MigrateApp:64 - Using JRE_HOME:        "C:\Program Files\Java\jre1.8.0_251"
    2020-08-04 21:11:00 TRACE MigrateApp:64 - Using CLASSPATH:       "TomcatA\bin\bootstrap.jar;TomcatA\bin\tomcat-juli.jar"
    2020-08-04 21:11:00 ERROR MigrateApp:72 - 04-Aug-2020 21:11:00.668 SEVERE [main] org.apache.catalina.startup.Catalina.stopServer No shutdown port configured. Shut down server through OS signal. Server not shut down.
    2020-08-04 21:11:00 ERROR MigrateApp:78 - [sailpoint.support.applicationdeployer.util.MigrateApp.StopTomcat(MigrateApp.java:73), sailpoint.support.applicationdeployer.util.MigrateApp.run(MigrateApp.java:36)]
    2020-08-04 21:11:00 ERROR MigrateApp:79 - Tomcat Shutdown Failed with error: 04-Aug-2020 21:11:00.668 SEVERE [main] org.apache.catalina.startup.Catalina.stopServer No shutdown port configured. Shut down server through OS signal. Server not shut down.
    2020-08-04 21:11:00 ERROR MigrateApp:39 - Tomcat Shutdown Failed with error: 04-Aug-2020 21:11:00.668 SEVERE [main] org.apache.catalina.startup.Catalina.stopServer No shutdown port configured. Shut down server through OS signal. Server not shut down.
    

    我不明白为什么我的代码试图关闭Tomcat-A。有人能帮我吗。

    如果您没有编辑Tomcat B
    shutdown.bat
    脚本,默认情况下,您会看到
    C:\TomcatB\bin\shutdown.bat
    确定CATALINA\u主页并执行:

    %CATALINA_HOME%\bin\catalina.bat
    
    看起来您的TomcatA VM正在将自己的CATALINA_主页传递给Tomcat B
    shutdown.bat,它覆盖了C:\TomcatB\bin使用的默认设置。您可以创建一个新脚本shutdown2.bat,该脚本不采用CATALINA_HOME环境变量,或者切换到
    ProcessBuilder
    并在
    ProcessBuilder
    launch命令中设置CATALINA_HOME,如下所示:

    File exe = new File(Directory, "shutdown.bat");
    String [] cmd = new String[] { exe.getAbsolutePath() };
    ProcessBuilder pb = new ProcessBuilder(cmd);
    pb.environment().put("CATALINA_HOME", exe.getParentFile().getParentFile().getAbsolutePath());
    Process process = pb.start();
    
    如果进程锁定,您可能需要在后台线程中使用输出/错误流,或者通过调用before start()将它们重定向到文件:


    我可以通过修改exec参数来实现它,如下所示。它现在工作正常

    String Directory = "C:\TomcatB\bin\";
    File workingDirecotry = new File(Directory);
    Process process = Runtime.getRuntime().exec(Directory + "shutdown.bat", null, workingDirecotry);
    
    String Directory = "C:\TomcatB\bin\";
    File workingDirecotry = new File(Directory);
    Process process = Runtime.getRuntime().exec(Directory + "shutdown.bat", null, workingDirecotry);