Выходные данные перестают читать из моего процесса - PullRequest
0 голосов
/ 01 февраля 2012

У меня есть довольно простой Java-код, в котором я запускаю другой процесс и пытаюсь записать все стандартные и стандартные ошибки в SLF4J.

this.service.serverProcess = Runtime.getRuntime().exec(arguments);

this.service.serverIsRunning = true;

BufferedReader serverStdout = new BufferedReader(new InputStreamReader(
                    this.service.serverProcess.getInputStream()), 16);
BufferedReader serverStderr = new BufferedReader(new InputStreamReader(
                    this.service.serverProcess.getErrorStream()), 16);

String stdoutLine = null;
String stderrLine = null;

while ((stdoutLine = serverStdout.readLine()) != null || 
        ((stderrLine = serverStderr.readLine()) != null)) {
    if (stdoutLine != null && stdoutLine.trim().length() > 0)
        logger.info("{}", stdoutLine);
    if (stderrLine != null && stderrLine.trim().length() > 0)
        logger.error("{}", stderrLine);
}

try { this.service.serverProcess.waitFor(); } catch (InterruptedException e) {};

this.service.serverIsRunning = false;

К сожалению, я получаю только самую первую строку вывода из своего процесса, я никогда не вижу больше вывода, чем это, хотя я уверен, что вывод гораздо больше, чем то, что я вижу.

Что здесь не так? Я бы хотел, чтобы он регистрировался сразу же, как только произошло событие, поскольку вывод важен для журналов, которые я веду. Как я могу получить полную информацию о STDOUT и STDERR моего процесса?

1 Ответ

2 голосов
/ 01 февраля 2012

Я подозреваю, что проблема в том, что вы никогда не читаете из stderr - поэтому, если процесс заполнил какой-либо буфер для stderr, но ничего не печатал в stdout, вы будете блокировать попытки чтения stdout.

Я предлагаю вам запустить один из циклов чтения в другом потоке: один читает из stdout, а другой читает из stderr.

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