Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Перенаправление потоков вывода нескольких процессов в один поток. / 11 сообщений из 11, страница 1 из 1
30.11.2014, 10:37
    #38820564
feomatr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенаправление потоков вывода нескольких процессов в один поток.
Задача:
Производим запуск нескольких процессов.. каждый из них может либо выполняться какое-то небольшое время(1, 10, 60 секунд), либо работать в качестве демона(30 минут)..
У процессов получаю InputStream и ErrorInputStream.. Хотелось бы выводить это добро в один поток.
Как всё "синхронизировать"?
То есть как произвести "Перенаправление потоков вывода нескольких процессов в один поток." ?

Сейчас есть код(метод), который запускает один процесс:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
    	ProcessBuilder pb = new ProcessBuilder(scriptName, arguments);
    Map<String, String> env = pb.environment();
    pb.directory(new File(pDir));
    Process p = pb.start();
    p.getErrorStream();
     
    try {
    Thread.sleep(2000l);
    } catch (InterruptedException e) {
    log.error("", e);
     
    }
    // todo Create Service Which can read From InputStream and ErrorStream... Console Output ?
    BufferedInputStream bis = new BufferedInputStream(p.getInputStream());
    InputStreamReader reader = new InputStreamReader(bis);
    BufferedReader bufferedReader = new BufferedReader(reader);
    for (; bufferedReader.ready(); ) {
    log.error("info: " + bufferedReader.readLine());
    // System.out.println("info: "+ bufferedReader.readLine());
    }
     
    bis = new BufferedInputStream(p.getErrorStream());
    reader = new InputStreamReader(bis);
    bufferedReader = new BufferedReader(reader);
    for (; bufferedReader.ready(); ) {
    log.error("errors: " + bufferedReader.readLine());
    // System.out.println("errors: "+ bufferedReader.readLine());
    }
...
Рейтинг: 0 / 0
30.11.2014, 13:45
    #38820658
YamahaR1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенаправление потоков вывода нескольких процессов в один поток.
feomatr,

Вот тут посмотрите, если я вас правильно понял:

http://stackoverflow.com/questions/14165517/processbuilder-forwarding-stdout-and-stderr-of-started-processes-without-blocki
...
Рейтинг: 0 / 0
30.11.2014, 14:53
    #38820681
DEVcoach
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенаправление потоков вывода нескольких процессов в один поток.
feomatr ,
Единственное возможное решение - стартовать отдельный поток для каждого процесса, где читать из out/err стримов этого процесса.
inheritIO - в общем случае вариант нерабочий, так как он будет загаживать стримы вашего процесса, хотите вы этого или нет. Как стартовать отдельный поток для процесса - дело ваше. Можно руками, это пару десятков строк кода. Можно какую-нибудь утилитарную библиотеку подключить.
...
Рейтинг: 0 / 0
01.12.2014, 09:37
    #38821036
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенаправление потоков вывода нескольких процессов в один поток.
DEVcoach feomatr ,
Единственное возможное решение - стартовать отдельный поток для каждого процесса, где читать из out/err стримов этого процесса.
inheritIO - в общем случае вариант нерабочий, так как он будет загаживать стримы вашего процесса, хотите вы этого или нет. Как стартовать отдельный поток для процесса - дело ваше. Можно руками, это пару десятков строк кода. Можно какую-нибудь утилитарную библиотеку подключить.

Вроде уже не обязательно потоки плодить?
http://docs.oracle.com/javase/8/docs/api/java/lang/ProcessBuilder.html#redirect-input
...
Рейтинг: 0 / 0
01.12.2014, 12:58
    #38821298
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенаправление потоков вывода нескольких процессов в один поток.
А если взять очередь - тогда у вас появиться много писателей - подписчиков ..и один читатель , который будет эту очередь разбирать ...по мере поступления данных ? такой вариант подойдет?
...
Рейтинг: 0 / 0
01.12.2014, 18:23
    #38821774
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенаправление потоков вывода нескольких процессов в один поток.
Может свой класс от какого нибудь InputStream породить и его методы тупо засинхронизировать? И перед один и тот же thread-safe экземпляр во все процессы?

p.s. возможно чушь сморозил, не проверял.
...
Рейтинг: 0 / 0
01.12.2014, 19:23
    #38821822
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенаправление потоков вывода нескольких процессов в один поток.
DEVcoachЕдинственное возможное решение - стартовать отдельный поток для каждого процесса, где читать из out/err стримов этого процесса.+1
...
Рейтинг: 0 / 0
02.12.2014, 00:26
    #38822062
feomatr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенаправление потоков вывода нескольких процессов в один поток.
В принципе, мне подходит создание отдельного треда на потоки процесса.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
StreamGobbler errorGobbler = new StreamGobbler(p.getErrorStream(), "ERROR");

// any output?
StreamGobbler outputGobbler = new StreamGobbler(p.getInputStream(), "OUTPUT");

// start gobblers
outputGobbler.start();
errorGobbler.start();


private class StreamGobbler extends Thread {
    InputStream is;
    String type;

    private StreamGobbler(InputStream is, String type) {
        this.is = is;
        this.type = type;
    }

    @Override
    public void run() {
        try {
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);
            String line = null;
            while ((line = br.readLine()) != null)
                System.out.println(type + "> " + line);
        }
        catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }
}



Ещё, потоки будут маркироваться, "Процесс Х, Еррор: ", а не просто сваливаться в одну кучу.
Потому, вместо
Код: java
1.
System.out.println(type + "> " + line);


, осталось сделать структуру и\или методы доступа к ней для записи данных Тредами.
...
Рейтинг: 0 / 0
02.12.2014, 09:19
    #38822169
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенаправление потоков вывода нескольких процессов в один поток.
feomatr,

Java Doc не пробовали читать? Redirect Error в Output доступен уже с Java 6.
...
Рейтинг: 0 / 0
02.12.2014, 23:08
    #38823093
feomatr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенаправление потоков вывода нескольких процессов в один поток.
Blazkowicz,

Сейчас внимательно перечитал ссылку, приведенную вами ранее.
Из прочитанного понял, что : при редиректе error в output, нет возможности написать "это ОШИБКИ из процесса PROCESS ". То есть, Не могу маркировать, стримы названиями процесса!

Что-то вроде:
запуск процессов, как последовательно, так и параллельно, чтобы output && error выводились в одну "консоль" с пометкой: процесс Х, цвет отображения COLOR. Консоль, получив как стримы, так и сопровождающую информацию отобразит разноцветный текст.
...
Рейтинг: 0 / 0
03.12.2014, 09:33
    #38823241
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенаправление потоков вывода нескольких процессов в один поток.
feomatrСейчас внимательно перечитал ссылку, приведенную вами ранее.

Похоже что не внимательно.
Вы привели код, в котором отдельно читаете output и error. Он не нужен. Это не решает вопроса с процессами. Это решает вопрос в том что отдельно output и error обрабатывать не обязательно. Можно всё слить в output и читать только его.
А процессы это отдельный вопрос. Я бы не занимался ерундой и сливал бы всё в разные файлы. А файлы потом уже можно комбинировать как душе угодно.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Перенаправление потоков вывода нескольких процессов в один поток. / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]