0

我有一个 Java 网络服务器,我从中使用 Apache commons exec 启动一个外部应用程序。在高层次上,流程是用户将指定参数并使用 POST 启动应用程序,然后会有一个状态页面,他们可以从中随时取消应用程序(它可能会运行数天)。

我像这样异步启动应用程序:

Map<String, String> procEnv = EnvironmentUtils.getProcEnvironment();
CommandLine cmdLine = CommandLine.parse(command);
DefaultExecutor executor = new DefaultExecutor();
executor.execute(cmdLine, procEnv, new DefaultExecuteResultHandler());

我知道在处理第一个 POST 请求时,我可以像这样终止进程:

executor.getWatchdog().destroyProcess();

但是我需要立即响应 POST 以便用户可以转到状态页面,这意味着我将无法DefaultExecutor从后续请求中访问该实例。鉴于我必须假设可能有多个用户因此运行的应用程序实例不止一个,我如何让用户发送单独的请求以稍后取消执行?(如有必要,我可以在响应中包含额外数据并取消请求。)

4

1 回答 1

0

如果您有某种方法可以识别可以返回给客户端并在“停止”请求中使用的外部应用程序的不同运行实例,您可以存储Map<String, ExecuteWatchdog>应用程序所有实例的标识符和看门狗的静态,这可以然后从以后的请求中访问。就像是:

private static Map<String, ExecuteWatchdog> watchdogs;
//...
public static String startApplication() {
  //...
  watchdogs.put(id, executor.getWatchdog());
}
public static void stopApplication(String id) {
  watchdogs.get(id).destroyProcess();
  watchdogs.remove(id);
}

请注意,如果用户没有取消执行并且应用程序自行结束,则该条目将保留在映射中,因此需要通过删除任何!theWatchdog.isWatching().

于 2014-07-16T12:53:44.200 回答