【发布时间】:2012-10-08 17:33:54
【问题描述】:
我正在使用 Apache exec 库调用 java 进程。如果进程被强制停止(使用任务管理器或其他方式),我需要做一些操作。 exec 库中是否有任何可用选项?我在 ResultHandler 中发现了一个 waitfor() 操作,它正在忙着等待。有没有可用的通知机制?
【问题讨论】:
-
看来您需要Watchdog timer。
我正在使用 Apache exec 库调用 java 进程。如果进程被强制停止(使用任务管理器或其他方式),我需要做一些操作。 exec 库中是否有任何可用选项?我在 ResultHandler 中发现了一个 waitfor() 操作,它正在忙着等待。有没有可用的通知机制?
【问题讨论】:
我希望 退出状态 反映进程是否被强制终止。
请参阅the tutorial,特别是参考您的评论,本节:
您的工作线程将阻塞,直到打印过程完成或 被看门狗杀死。因此执行打印作业 异步就可以了。在这个例子中,我们创建了一个 'ExecuteResultHandler' 的实例并将其传递给 'Executor' 实例以异步执行该过程。这 'resultHandler' 拾取任何有问题的异常或进程退出 代码
【讨论】:
很久以前有人问过这个问题,但我今天偶然发现了它......
解决方案如下:您只需设置ExecuteResultHandler 并将其传递给execute method。然后不涉及主动等待。像这样:
DefaultExecuteResultHandler resultHandler = new DefaultExecuteResultHandler() {
@Override
public void onProcessComplete(int exitValue) {
super.onProcessComplete(exitValue);
log.info("Process finished");
}
@Override
public void onProcessFailed(ExecuteException e) {
super.onProcessFailed(e);
log.info("Process failed miserably");
}
};
String process = "C:\\Program Files (x86)\\Adobe\\Acrobat Reader DC\\Reader\\AcroRd32.exe";
CommandLine cmdLine = new CommandLine(process);
cmdLine.addArgument("C:\\Users\\francois.marot\\Downloads\\UtiliserLesDernieres DLL.pdf");
DefaultExecutor executor = new DefaultExecutor();
// the watchdog purpose is to kill the process after a specified timeout
SphereExecutionWatchdog watchdog = new SphereExecutionWatchdog(5000);
executor.setWatchdog(watchdog);
executor.execute(cmdLine, resultHandler);
【讨论】: