如何在使用Apache Commons Exec调用进程时收到通知?

时间:2012-10-18 09:39:25

标签: apache exec

我正在使用Apache exec库调用java进程。如果强制停止进程(使用任务管理器或其他方式),我需要执行一些操作。 exec库中有没有可用的选项?我在ResultHandler中找到了一个waitfor()操作,它正在进行繁忙的等待。有没有可用的通知机制?

2 个答案:

答案 0 :(得分:0)

我希望退出状态能够反映该进程是否已被强制杀死。

请参阅the tutorial,特别是您的评论,本节:

  

您的工作线程将阻止,直到打印过程完成或   被看门狗杀了。因此执行打印作业   异步会做的伎俩。在这个例子中我们创建了一个   'ExecuteResultHandler'的实例并将其传递给'Executor'   实例,以便异步执行进程。该   'resultHandler'选择任何违规异常或进程退出   代码

答案 1 :(得分:0)

很久以前就问过这个问题,但我今天偶然发现了......

以下是解决方案:您只需设置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);