Как остановить другого кота из кода Java (JSP / Servlet) - PullRequest
1 голос
/ 04 августа 2020

У меня установлены два кота, как показано ниже:

  1. Tomcat-A {Путь: C: \ TomcatA, Порты: Порт коннектора = "8080" redirectPort = "8443" порт выключения как - 1}
  2. Tomcat-B {Путь: C: \ TomcatB, Порты: Connector port = "8090" redirectPort = "8444" порт выключения как 8015}

У меня есть приложение JSP / сервлетов, которое работает на Tomcat-A. Мое требование - выключить 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. Может ли кто-нибудь помочь мне с тем же.

Ответы [ 2 ]

0 голосов
/ 06 августа 2020

Я могу добиться этого, изменив параметры exe c, как показано ниже. Теперь он работает правильно.

String Directory = "C:\TomcatB\bin\";
File workingDirecotry = new File(Directory);
Process process = Runtime.getRuntime().exec(Directory + "shutdown.bat", null, workingDirecotry);
0 голосов
/ 05 августа 2020

Если вы не редактировали свой сценарий Tomcat B shutdown.bat по умолчанию, вы увидите, что C:\TomcatB\bin\shutdown.bat определяет CATALINA_HOME и выполняет:

%CATALINA_HOME%\bin\catalina.bat

Похоже, ваша виртуальная машина TomcatA передает свою собственный CATALINA_HOME для Tomcat B shutdown.bat, который отменяет значение по умолчанию, используемое C: \ TomcatB \ bin. Вы можете либо создать новый сценарий shutdown2.bat, который не принимает переменную среды CATALINA_HOME, либо переключиться на ProcessBuilder и установить CATALINA_HOME в команде запуска ProcessBuilder примерно так:

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();

Если процесс блокировки, вам может потребоваться использовать потоки вывода / ошибок в фоновом потоке или перенаправить их в файл, вызвав перед start ():

pb.redirectOutput(outfile);
pb.redirectError(errfile);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...