2014-07-07 4 views
0

Apache Web Server를 사용하여 외부 응용 프로그램을 시작합니다. 높은 수준에서 사용자는 매개 변수를 지정하고 POST로 응용 프로그램을 시작한 다음 언제든지 응용 프로그램을 취소 할 수있는 상태 페이지를 갖게됩니다 (며칠 동안 실행될 수 있음).하나의 요청에 대해 webserver에서 다른 프로그램을 실행하고 나중의 요청에 따라이를 종료하십시오.

나는 같은 비동기 적으로 응용 프로그램을 시작 해요 :

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 인스턴스에 액세스 할 수 없습니다. 두 명 이상의 사용자가있을 수 있으므로 하나 이상의 응용 프로그램 인스턴스가 실행되고 있다고 가정해야 할 경우 사용자가 나중에 실행 취소를 요청할 수 있도록하려면 어떻게해야합니까? (응답에 여분의 데이터를 포함하고 필요할 경우 요청을 취소 할 수 있습니다.)

답변

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() .