Runtime.exec () не работает правильно в tomcat / веб-приложении - PullRequest
0 голосов
/ 05 марта 2012

У меня странная проблема с запуском программы .exe в моем WebApplication. Работает нормально в режиме консоли.

Код моего exe-приложения:

            ...
            Console.WriteLine("before getEnvirement");
            IDictionary environmentVariables = Environment.GetEnvironmentVariables();
            foreach (DictionaryEntry de in environmentVariables)
            {
                Console.WriteLine("  {0} = {1}", de.Key, de.Value);
            }
            Console.WriteLine("before new Application");
            this.application = new App();
            Console.WriteLine("after new Application");
            ...

Где App () - это класс из библиотеки COM (я добавил ссылку, конечно).

Моя консоль Java / код веб-приложения:

    try {
        String[] callAndArgs = {"C:\\temp\\program.exe", "arg1", "arg2"};
        Process p = Runtime.getRuntime().exec(callAndArgs);
        p.waitFor();
    } catch (IOException e) {
        System.out.println("IOException Error: " + e.getMessage());
    } catch (Exception e) {
        System.out.println("Exception: " + e.getMessage());
    }

Вывод в «режиме консоли» (правильный):

before getEnvirement
  <all my envirements>
before new Application
after new Application

Вывод в «режиме веб-приложения» (плохо):

before getEnvirement
  Path = C:\Windows\system32; <...>
  TEMP = C:\Windows\TEMP

или когда я удаляю код getEnvirement (тоже плохо):

before getEnvirement
before new Application

Exe-приложение не закрывается на tomcat (я должен использовать диспетчер задач, чтобы убить его)

И мои вопросы: почему это не работает правильно на tomcat? Почему у exe-программы возникают проблемы с получением системных требований, когда я запускаю ее на tomcat? И напоследок: почему он работает в режиме консоли? :)

1 Ответ

1 голос
/ 05 марта 2012

Интересно, блокируется ли ваш порожденный процесс, пытаясь записать свой вывод.Из документа для Процесс :

Созданный подпроцесс не имеет собственного терминала или консоли.Все его стандартные операции io (т.е. stdin, stdout, stderr) будут перенаправлены на родительский процесс через три потока (getOutputStream (), getInputStream (), getErrorStream ()).Родительский процесс использует эти потоки для подачи входных данных и получения выходных данных из подпроцесса.Поскольку некоторые собственные платформы предоставляют ограниченный размер буфера только для стандартных входных и выходных потоков, невозможность оперативной записи входного потока или чтения выходного потока подпроцесса может привести к блокировке подпроцесса и даже к тупиковой ситуации

Вы должны использовать стандартный процесс out / err при запуске процесса, и в идеале в отдельных потоках, чтобы избежать блокировки.См. этот ответ для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...