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 № 1Huh 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.