/ / Ejecutar un programa externo usando el creador de procesos o apache commons exec - java, processbuilder, apache-commons-exec

Ejecución de un programa externo utilizando el generador de procesos o el apache commons exec - java, processbuilder, apache-commons-exec

Necesito ejecutar una aplicación externa que devuelve datos grandes (tarda más de 2 horas en completarse) y que genera datos continuamente.

Lo que necesito hacer es ejecutar este programaasincrónicamente y capturar la salida en un archivo. Intenté usar Java Process Builder, sin embargo, parece que se bloquea y devuelve la salida solo cuando se sale del programa o se termina con fuerza.

Traté de usar el generador de procesos y generé un nuevo hilo para capturar la salida, pero aún así no me ayudó.

Luego leí acerca de apache commons exec e intenté lo mismo. sin embargo, esto también parece estar tardando mucho y devuelve diferentes códigos de error (para la misma entrada)

CommandLine cmdLine = new CommandLine("/opt/testsimulator");

DefaultExecuteResultHandler resultHandler = new DefaultExecuteResultHandler();
ByteArrayOutputStream stdout = new ByteArrayOutputStream();
PumpStreamHandler psh = new PumpStreamHandler(stdout);
ExecuteWatchdog watchdog = new ExecuteWatchdog(60*1000);
Executor executor = new DefaultExecutor();
executor.setStreamHandler(psh);
executor.setWatchdog(watchdog);
try {
executor.execute(cmdLine);
} catch (ExecuteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

Cualquier ayuda o ejemplos de trabajo serían muy útiles.

Respuestas

5 para la respuesta № 1

Huh Utilizando ProcessBuilder debería funcionar para su configuración. Por ejemplo, el siguiente patrón funciona para mí:

ProcessBuilder pb = new ProcessBuilder("/tmp/x");
Process process = pb.start();
final InputStream is = process.getInputStream();
// the background thread watches the output from the process
new Thread(new Runnable() {
public void run() {
try {
BufferedReader reader =
new BufferedReader(new InputStreamReader(is));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
is.close();
}
}
}).start();
// the outer thread waits for the process to finish
process.waitFor();

El programa que estoy ejecutando es solo un script con un montón de sleep 1 y echo líneas:

#!/bin/sh
sleep 1
echo "Hello"
sleep 1
echo "Hello"
...

La lectura del hilo del proceso escupe un Hello cada segundo más o menos.