В Groovy есть хороший механизм выполнения процессов, и я бы хотел его использовать.
Есть метод consumeProcessOutput
, который выполняет всю необходимую работу. Но я хочу, чтобы мои дополнительные функции вводились каждый раз, когда consumeProcessOutput
вызывает append
или что-то в out
экземпляре.
public class ProcessExecutor {
static public void execute(IOutput output, String processName) {
def process = processName.execute()
def out = new StringBuffer()
process.consumeProcessOutput(out, out)
process.waitFor()
}
}
Мне известно о
use (MyStringBufferIntercept) {
process.consumeProcessOutput(out, out)
}
Но они, кажется, работают только для текущего потока, а consumeProcessOutput
создает дополнительные потоки.
Так есть ли решение для прослушивания строк, добавляющих и вызова output.addLine(line)
и output.addErrorLine(line)
?
Пока у меня есть только одно решение, которое не работает, когда вывод ошибок идет вместе с нормальным выводом довольно быстро: порядок меняется.
def process = processName.execute()
def inThread = Thread.start {
process.in.eachLine{ line -> output.addLine(line)}
}
def errThread = Thread.start {
process.err.eachLine{ line -> output.addErrorLine(line)}
}
inThread.join()
errThread.join()
process.waitFor()
Я согласен с решением Java. Но я склонен думать, что Groovy должен быть более элегантным.