当前位置: 首页 > 知识库问答 >
问题:

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

叶文博
2023-03-14

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

  1. Tomcat-A{Path:C:\Tomcata,Ports:Connector port=“8080”redirectport=“8443”关闭端口为-1}
  2. tomcat-b{Path:c:\tomcatb,Ports:Connector port=“8090”redirectport=“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。有谁能帮我做同样的事吗。

共有1个答案

顾斌
2023-03-14

如果您没有从默认值编辑Tomcat Bshutdown.bat脚本,您将看到c:\tomcatb\bin\shutdown.bat确定CATALINA_HOME并执行:

%CATALINA_HOME%\bin\catalina.bat

看起来您的TomcatA VM将自己的CATALINA_HOME传递给Tomcat Bshutdown.bat,它覆盖了C:\tomcatb\bin使用的默认值。您可以创建一个不采用CATALINA_HOME环境变量的新脚本shutdown2.bat,或者切换到processbuilder并在processbuilder启动命令中设置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()将它们重定向到文件:

pb.redirectOutput(outfile);
pb.redirectError(errfile);
 类似资料:
  • 问题内容: 我想将多个值从一个servlet传递到另一个servlet。请告诉我如何通过? 问题答案: 取决于您是否使用会话: 使用session.setAttribute()将数组存储在会话变量中。 使用session.getAttribute();检索数组。 但是,变量将一直保留到会话终止,您用其他东西覆盖它或将其删除为止。 如果将一个servlet转发到另一个servlet,则可以将其存储在

  • 问题内容: 我需要从另一个Servlet调用Servlet的POST方法,并在Servlet的参数中传递一个Blob。这是可能的,如果可以的话,该怎么做。PS:我不能使用Apache HttpClient 问题答案: 您需要自己创建并发送HTTP请求。您不能使用转发/重定向/包含,因为您要将方法从GET更改为POST,并且想要发送请求。 由于显然不是HttpClient(以及其他第三方库?),您最

  • 问题内容: 我尝试了这个,但不显示消息仅重定向 login.jsp Login_Servlet 是否可以显示这样的消息? 如果是这样,我做错了吗? 问题答案: 您可能会这样做: 编辑: 2018年3月20 日,美国东部时间08:19 或 不使用js

  • 问题内容: 我有一个JSP文件为 jsp 1.jsp ,另一个JSP文件为 jsp 2.jsp 我已经包括 JSP 2.jsp 在 JSP 1.jsp页面 使用 现在,我需要某些元素上的click事件。在那件事上,我想将一个字符串变量传递给包含的jsp。 假设我有一个列表,单击它后,我想将该列表的名称转移到另一个JSP, 在另一个JSP中,我试图使用该字符串执行某些任务。 我在没有任何servle

  • viewServlet.java: 我的目标是将'viewservlet.java'中的html代码编写为'result.jsp'中的纯html代码。 我所期望的是,如果我用jsp编写纯html代码,那么所有的记录都将从“MySQL”中检索,将显示在viewservlet.java中。如果我想要编辑,那么删除将发生在“viewservlet.java”中 我尝试了Request.GetAttrib

  • 我正在研究一个合作医疗系统。 我的代码在url调用的servlet的