2016-12-20 3 views
1

프로세스 및 스레드와 관련된 문제가 있습니다. 내 시나리오는 다음과 같습니다공유 프로세스/스레드

    내 자바 응용 프로그램, '스타터 - 앱'을 호출합니다 Thread라는 이름의 내 ProcessBuilder와 다른 EXE 응용 프로그램 (Diagnosis.exe)을 시작

  • : 이후

    Thread startGXThread = new Thread(new Runnable() { 
        @Override  
        public void run() { 
         try { 
          ... 
          File gxExe = new File(pathToGX); // Path to Diagnosis.exe 
          gxp = pb.start(); 
          gxp.waitFor(); 
    
         } catch (IOException e) { 
          LOG.error("Can't start module"); 
          LOG.error(e.getMessage(), e); 
         } catch (InterruptedException e) { 
          LOG.debug("thread interrupted. Destroy process"); 
          LOG.debug(e.getMessage(), e); 
          if (gxp != null) { 
           gxp.destroy(); 
           LOG.debug("process exit value: " + gxp.exitValue()); 
          } 
         } 
        } 
    }, "diag_thrd"); 
    
  • 부두 webserver (ServiceWebApp)는 webapp로 시작됩니다.

  • 크롬을 시작하고 'Starter-App'은 닫힐 때들을 수 있습니다.
  • 크롬이 '시작 - 앱'을 닫으면 부두가 중지되고 시작 앱인 .Diagnosis.exe가 종료됩니다. 이것은에 의해 수행됩니다

    Runtime.getRuntime().addShutdownHook(new Thread() { 
        @Override 
        public void run() { 
         stopAsync(); 
        } 
    }); 
    
    public static void stopAsync() { 
        Thread diag = getThread("diag_thrd"); 
        if (diag != null) { 
         diag.interrupt(); 
        } 
        if (gxp != null) { 
         gxp.destroy(); 
         LOG.debug("process exit value: " + gxp.exitValue()); 
        } 
    } 
    

질문 : 난 아직도/종료 진단을 파괴 할 수있는 동안, 웹 애플리케이션 내에서 startet Diagnosis.exe을 중지했다가 다시 시작 할 수 있어야 . '초보자 용 앱'에서 크롬이 멈 추면 exe가 실행됩니다. 내 문제를 설명하고 제안을 바랍니다.

+0

그래서 Starter-App은 부두 서킷 및 Chromium 인 Diagnosis.exe를 시작합니다. – Sonata

+0

맞습니다. 'Starter-App'은 Diagnosis.exe, Jetty (배포 된 웹 응용 프로그램 포함) 및 Chromium (웹 응용 프로그램에 대한 URL 포함)을 시작합니다. Chromium이 종료되면 (사용자가) 'Starter-App'은이를 인식하고 부두 및 Diagnosis.exe를 종료합니다. – kism3t

답변

2

Anands에 대한 답을 얻으려면 Diagnostic.exe와 Starter-App 사이에 웹 소켓 또는 다른 옵션을 사용하여 IPC 형식이 필요하다고 생각합니다. How to have 2 JVMs talk to one another.

webapp는 Diagnosis.exe를 Starter-App으로 다시 시작하라는 요청을 보내고 Starter-App은 항상 응용 프로그램 트리오 관리를 담당합니다.

+0

이 아이디어가 마음에 들었습니다. Webapp은 Diagnosis.exe를 Starter-App으로 다시 시작하라는 요청을 보내고 Starter-App은 항상 응용 프로그램 트리오 관리를 담당합니다. –

1

솔루션이 있지만 구현하기가 까다 롭습니다.

당신은 항상 여기에 예를 Killing a process using Java

설명 ps kill #pid 같은 * nix에서 스크립트 API를의를 사용할 수 있지만 웹 서버는 PID의가보고있는 알고있다. 그런 것을 구현하기 위해 볼 수있는 유일한 옵션은 소켓이나 웹 서비스를 사용하는 것입니다. 따라서 Diagnosis.exe 프로세스의 현재 pid가 무엇인지 추적하고 죽이기 전에 해당 ID를 사용합니다.

+0

나는 창문을 사용하고있다. 따라서 아마'ps kill '이 아닐 것입니다. webapp에 시스템 매개 변수로 pid를 전달할 수 있지만 일단 웹 응용 프로그램이 종료되면 'starter-app의 참조가 더 이상 유효하지 않습니다. – kism3t

+0

예. Windows에는 다른 옵션이 있습니다. 또한 시스템 매개 변수로 PID를 보내지는 않겠지 만 하트 비트 또는 일부 RMI/Webservice 호출로 보내야합니다. 웹 서버가 프로세스를 다시 시작할 가능성이 있기 때문입니다. 따라서 누구든지 Diagnostic.exe를 다시 시작하면 찾는 다른 새 프로세스 ID를 알립니다. –