commons-exec: зависает при вызове executor.execute (commandLine); - PullRequest
3 голосов
/ 24 апреля 2010

Понятия не имею, почему это висит. Я пытаюсь перехватить вывод процесса, запущенного через commons-exec, и продолжаю зависать. Ниже приведен пример программы для демонстрации такого поведения.

import java.io.DataInputStream;
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
import org.apache.commons.exec.CommandLine;
import org.apache.commons.exec.DefaultExecutor;
import org.apache.commons.exec.ExecuteException;
import org.apache.commons.exec.PumpStreamHandler;
public class test {

public static void main(String[] args) {
    String command = "java";

    PipedOutputStream output = new PipedOutputStream();
    PumpStreamHandler psh = new PumpStreamHandler(output);

    CommandLine cl = CommandLine.parse(command);

    DefaultExecutor exec = new DefaultExecutor();
    DataInputStream is = null;
    try {
        is = new DataInputStream(new PipedInputStream(output));
        exec.setStreamHandler(psh);
        exec.execute(cl);
    } catch (ExecuteException ex) {
    } catch (IOException ex) {
    }

    System.out.println("huh?");
}
}

Ответы [ 2 ]

9 голосов
/ 24 апреля 2010

Согласно javadoc , execute(CommandLine command) является синхронным, execute(CommandLine command, ExecuteResultHandler handler) с другой стороны асинхронным.

5 голосов
/ 24 апреля 2010

Вызванная вами команда java производит вывод в свой стандартный поток вывода. Этот поток должен быть закачан во входной поток вашей вызывающей программой. Это не происходит в вашей программе.

Вы должны прочитать входной поток (is в вашем коде) в отдельном потоке, потому что именно так работают потоковые каналы. Обратите внимание, что вы должны начать чтение потока перед вызовом execute().

См. Также Получение большого количества выходных данных от Apache Commons-Exec

Согласно вашему другому вопросу Потоковый вывод с помощью commons-exec? вы ожидаете больших данных, поэтому вы должны использовать конвейерные потоки и не можете использовать более простой подход использования ByteArrayInputStream в качестве вывода. Ответ, который вы даете себе там, страдает той же проблемой, что и ваш код здесь.

...