2013-05-17 8 views
5

Sto cercando di eseguire un'istanza ApacheDS dalla mia applicazione java.
Io uso questo metodo run() di classe ScriptWrapper per eseguire script che viene fornito con ApacheDS per eseguirlo:Come eseguire un'applicazione java da un'altra applicazione java e mantenerla in esecuzione dopo il ritorno del programma master?

public class ScriptWrapper implements Serializable { 
    private String scriptPath; 

    protected Process run(List<String> params) throws IOException { 
     LOGGER.debug("Executing script="+scriptPath); 
     params.add(0, scriptPath); 

     if(workDir != null) { 
      return Runtime.getRuntime().exec(params.toArray(new String[params.size()]), envp.toArray(new String[envp.size()]), new File(workDir)); 
     } else { 
      return Runtime.getRuntime().exec(params.toArray(new String[params.size()])); 
     } 
    } 
} 

ma il problema è, che quando tomcat su cui questa applicazione viene eseguito, è terminato e/o ScriptWrapper è spazzatura raccolta, termina anche l'istanza di ApacheDS. Come tenerlo in vita?

MODIFICA: Grazie per le vostre risposte. Ho deciso di affrontare il problema in modo diverso e ho demonizzato il processo con l'avvio di script con l'installazione binaria di ApacheDS.

+0

problema risolto se sì, per favore condividi la soluzione. –

risposta

0

Il tuo processo principale dovrebbe attendere i suoi figli prima di terminare.

L'oggetto Processo ha un metodo waitFor(). È possibile creare un nuovo thread e quindi eseguire e attendere qualsiasi altro processo.

0

Tecnicamente è possibile impedire che l'oggetto venga sottoposto a garbage collection tenendo un riferimento allo ScriptWrapper.

È possibile utilizzare il singleton per mantenere il riferimento. Poiché il tuo oggetto è referenziato attivamente, non verrà raccolto da GC.

public class ScriptWrapper { 
    private static ScriptWrapper uniqueInstance; 

    private ScriptWrapper() { 
    } 

    public static synchronized ScriptWrapper getInstance() { 
    if (uniqueInstance == null) { 
     uniqueInstance = new ScriptWrapper(); 
    } 
    return uniqInstance; 
    } 

    protected Process run(List<String> params) throws IOException { 
     LOGGER.debug("Executing script="+scriptPath); 
     params.add(0, scriptPath); 

     if(workDir != null) { 
      return Runtime.getRuntime().exec(params.toArray(new String[params.size()]), envp.toArray(new String[envp.size()]), new File(workDir)); 
     } else { 
     return Runtime.getRuntime().exec(params.toArray(new String[params.size()])); 
     } 
    } 

}

Spero che questo potrebbe aiutare!.

+0

Java API for Process dice: Il sottoprocesso non viene ucciso quando non ci sono più riferimenti all'oggetto Process, ma il sottoprocesso continua ad essere eseguito in modo asincrono –

0

Mi chiedo chiamando una shell o il comando su Windows per eseguire il comando dovrebbe funzionare?

Runtime.getRuntime().exec("/bin/bash -c yourCommand yourOptions &").waitFor(); 

The Bash & (e commerciale) è un operatore di controllo incorporato utilizzato per generare i processi. Dalla pagina man di Bash, "Se un comando viene terminato dall'operatore di controllo &, la shell esegue il comando in sottofondo in una sottoshell".

io non sono sicuro di come finestre avrebbe funzionato provare magari

Runtime.getRuntime().exec("command.exe yourCommand yourOptions").waitFor(); 
0

In finestre è come questo

Process p = Runtime.getRuntime().exec("cmd /c yourCommand yourOptions"); 

non è necessario mettere p.waitFor() ..

Problemi correlati