我正在尝试从我的java应用程序运行ApacheDS实例
我使用ScriptWrapper类的run()
方法来执行ApacheDS附带的脚本来运行它:
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)
你的主要过程应该在结束之前等待它的孩子。
对象Process有一个方法waitFor()
。您可以创建一个新线程,然后运行并等待任何其他进程。
答案 1 :(得分: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()]));
}
}
}
希望这可以帮到你!
答案 2 :(得分:0)
我想通过在Windows上调用shell或命令执行命令会有用吗?
Runtime.getRuntime().exec( "/bin/bash -c yourCommand yourOptions &" ).waitFor();
The Bash&amp; (&符号)是用于分叉进程的内置控件操作符。在Bash手册页中,“如果命令由控制操作符&amp;终止,则shell在子shell中在后台执行命令”。
我不确定Windows会如何运作尝试
Runtime.getRuntime().exec( "command.exe yourCommand yourOptions" ).waitFor();
答案 3 :(得分:0)
在Windows中就像这样
Process p = Runtime.getRuntime().exec( "cmd /c yourCommand yourOptions");
你不需要放p.waitFor()
..