2010-06-15 17 views
18

sto cercando di decidere in merito al fatto di utilizzare ProcessBuilder o Commons exec,Decidere tra Apache Commons exec o ProcessBuilder

miei requisiti sono che sto semplicemente cercando di creare un processo demone la cui stdout/stdin/stderr che faccio non mi interessa. Inoltre voglio eseguire un'uccisione per distruggere questo processo quando sarà il momento.

Sto usando Java su Linux.

So che entrambi hanno i loro dolori e le insidie ​​(come essere sicuri di usare thread separati per inglobare i flussi può portare a blocchi o deadlock e chiudere i flussi in modo da non lasciare file aperti in giro) e volevo sapere se Qualcuno aveva suggerimenti in un modo o nell'altro e buone risorse da seguire.

+1

Forse se ha ricapitolato quei dolori e le insidie ​​...? – skaffman

+0

Vedi le modifiche sopra. – Traker

risposta

8

commons-exec non è la migliore libreria che abbia mai usato, ma risolve il più grande trabocchetto nell'invocazione del processo Java che sta gestendo/consumando stdout/sterr correttamente. Ho usato ProcessBuilder in passato, che va bene, e commons-exec ora che è anche bene e gestisce facilmente la maggior parte dei casi comuni.

1

Se si desidera utilizzare un processo daemon, forse Apache Commons Daemon sarebbe più appropriato?

1

Commons Daemon esegue il processo Java come un daemon, ma non lo fa come ci si aspetterebbe. Ad esempio, quando un programma C standard avvia un demone (prendi apache o sshd per esempio), eseguono alcuni controlli di config di integrità e altre cose (come il blocco di un lockfile) prima di forking in background. Apache Commons Daemon è un programma c che avvia un'applicazione java e non consente di inserire i controlli di integrità nel codice Java AFAIK e quindi interrompe ciò che considero importanti servizi daemon.

Quindi, se stai cercando di implementare un launcher daemon che si comporta in modo simile a sshd, apache, ecc. Allora suggerirei commons exec.

7

La libreria ZT Process Executor è un'alternativa a Apache Commons Exec. Ha funzionalità per eseguire comandi, catturare il loro output, impostare i timeout, ecc.

Non l'ho ancora usato ma sembra ragionevolmente ben documentato.

Esempio dalla documentazione: Esecuzione di un comando, pompaggio dello stderr in un registratore, che restituisce l'output come stringa UTF8.

String output = new ProcessExecutor().command("java", "-version") 
    .redirectError(Slf4jStream.of(getClass()).asInfo()) 
    .readOutput(true).execute() 
    .outputUTF8(); 

La sua documentazione elenca i seguenti vantaggi rispetto Commons Exec:

  • Migliorata la gestione dei flussi di
    • di lettura/scrittura ai flussi
    • Reindirizzamento stderr su stdout
  • Migliore gestione dei timeout
  • migliorando il controllo di codici di uscita API
    • Uno fodere per casi d'uso piuttosto complessi
    • Uno fodere per ottenere in uscita dal processo in una stringa
    • migliorate
    • d'accesso processo oggetto presente
    • Supporto per processi asincroni (Future)
  • registrazione migliorata con SLF4J API
  • Supporto per più processi
Problemi correlati