Ejecutar un progtwig externo usando el generador de procesos o el 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 progtwig de forma asíncrona y capturar la salida en un archivo. Intenté usar el generador de procesos Java, sin embargo, parece que se bloquea y devuelve la salida solo cuando el progtwig se cierra o finaliza de forma forzada.

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

Luego leí sobre el apache commons exec y probé lo mismo. sin embargo, esto también parece llevar mucho tiempo 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ía de mucha ayuda.

Huh Usar 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 progtwig que estoy ejecutando es solo un script con un montón de líneas de sleep 1 y echo :

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

La lectura del hilo del proceso escupe un Hello cada segundo.

    Intereting Posts