2013-05-17 44 views
5

我想從我的Java應用程序運行ApacheDS實例。
我用ScriptWrapper類的這種run()方法來執行隨機附帶ApacheDS中的腳本來運行它:如何從另一個Java應用程序運行Java應用程序並在主程序返回後保持運行?

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()])); 
     } 
    } 
} 

但問題是,當Tomcat在此應用程序運行,終止和/或ScriptWrapper是垃圾收集,ApacheDS的實例也終止。如何保持它活着?

編輯:謝謝你的回答。我已決定以不同的方式解決問題,並使用二進制ApacheDS安裝腳本來守護進程。

+0

問題,請分享解決方案。 –

回答

0

你的主要過程應該在結束之前等待它的孩子。

對象進程有一個方法waitFor()。您可以創建一個新線程,然後運行並等待任何其他進程。

0

從技術上講,您可以通過保留ScriptWrapper的引用來防止垃圾收集。

您可以使用單例來保存引用。由於您的對象被主動引用,它不會被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()])); 
     } 
    } 

}

希望能幫助你!

+0

Process for Java API說明:當沒有對Process對象的更多引用時,子進程不會被終止,而是子進程會繼續異步執行 –

0

我想知道通過調用shell或Windows上的命令來執行你的命令將工作?

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

的擊&(符號)是一個用於叉處理的內置的控制操作員。在Bash手冊頁中,「如果命令由控制操作員&終止,則shell在子shell中在後臺執行該命令」。

我不知道窗口將如何工作了嘗試,也許

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

在windows就是這個樣子

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

你不需要把p.waitFor() ..如果是解決

相關問題