2016-12-20 3 views
1

У меня возникла проблема с процессом и потоками. Мой Сценарий:Share Process/Thread

  • Мои приложения Java, называют его 'Стартер-App', начинается другой ехе приложения (Diagnosis.exe) с ProcessBuilder в имени Thread:

    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.

  • start chromium и «Starter-App» слушать, когда он закрыт.
  • Как только хром закрывает «Стартер-приложение», это распознает и останавливает причал, а также прекращает приложение startet.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()); 
        } 
    } 
    

Вопрос: мне нужно, чтобы быть в состоянии остановить Diagnosis.exe от запущен при в веб-приложение и запустить его снова, в то время как все еще быть в состоянии уничтожить/выключение диагнозе. exe, когда хром останавливается внутри «Starter-App». Надеюсь, я мог бы объяснить свою проблему и надеяться на предложения.

+0

Итак, Starter-App запускает Diagnosis.exe, причал и Chromium? – Sonata

+0

Правильно. «Стартер-приложение» запускает Diagnosis.exe, Jetty (с развернутым webapp) и Chromium (с URL-адресом для webapp). Когда Chromium закрывается (пользователем), «Starter-App» распознает это и выключает причал и Diagnosis.exe. – kism3t

ответ

2

Основываясь на ответах Anands, я думаю, вам нужна какая-то форма IPC между Diagnosis.exe и вашим стартовым приложением, используя websockets или ряд других опций для некоторых идей: 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

Я думаю, что есть решение, но сложное для реализации.

Вы всегда можете использовать * NIX API, как ps kill #pid, как объяснено в примере здесь Killing a process using Java

Но ваш веб-сервер должен знать, какой PID-искать. Единственный вариант, который я вижу для реализации такой вещи, - использование сокетов или веб-сервисов. Поэтому вы отслеживаете, что такое текущий pid процесса Diagnosis.exe, и используйте этот идентификатор перед убийством.

+0

Я использую окна. Так что, вероятно, это не будет 'ps kill'. Я могу передать pid как системный параметр в webapp, но как только веб-приложение отключится, ссылка «starter-app» уже недействительна. – kism3t

+0

Да. У Windows будет другой вариант. Также я бы не рекомендовал отправлять PID как системный параметр, но это должно быть отправлено в виде сердечного ритма или какого-либо вызова RMI/Webservice. потому что есть возможность перезапуска веб-сервера. Таким образом, любой, кто перезагружает Diagnostic.exe, уведомляет о другом из нового идентификатора процесса для поиска. –