在一个请求上从Web服务器启动另一个程序,并在以后的请求中终止它

时间:2014-07-07 18:55:37

标签: java webserver apache-commons-exec

我有一个Java Web服务器,我正在使用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实例。我怎么能让用户发送一个单独的请求来取消执行,因为我必须假设可能有多个用户,因此运行了多个应用程序实例? (如果需要,我可以在响应和取消请求中包含额外数据。)

1 个答案:

答案 0 :(得分: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()中的任何条目来定期清理它。