2016-12-20 11 views
1

私はプロセスとスレッドに関する問題に直面しています。私のシナリオは次のとおりです。共有プロセス/スレッド

  • 私のJavaアプリケーション、 'スターターアプリ' それを呼び出す、という名前ThreadProcessBuilderで別の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'は閉じたときに聴きます。
  • クロムが '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()); 
        } 
    } 
    

質問:私はまだ/シャットダウン診断を破壊することができる一方で、Webアプリケーション内からstartet Diagnosis.exeを停止し、再度起動できるようにする必要があり 。 chromiumが 'Starter-App'内で停止するとexeになります。 私は自分の問題を説明し、示唆を得ることができれば幸いです。

+0

したがって、Starter-AppはDiagnosis.exeとjettyサーバーとChromiumを起動しますか? – Sonata

+0

そうです。 'Starter-App'はDiagnosis.exe、Jetty(デプロイされたWebアプリケーション)、Chromium(WebアプリケーションのURL)を起動します。 Chromiumが(ユーザーによって)終了すると、 'Starter-App'はこれを認識して、突堤とDiagnosis.exeをシャットダウンします。 – kism3t

答えて

2

Anandsの回答によれば、Diagnosis.exeとStarter-Appの間に、Webソケットやその他のオプションを使用して、いくつかのアイデアのための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のを探すためにどの知っている必要があります。そのようなことを実装するために私が見る唯一のオプションは、ソケットまたはWebサービスを使用することです。したがって、Diagnosis.exeプロセスの現在のpidを追跡し、そのIDを使用してから削除します。

+0

私は窓を使用しています。だから、おそらく 'ps kill 'ではないでしょう。私はwebappにシステムパラメータとしてPIDを渡すことができますが、Webアプリケーションがシャットダウンされると、 'starter-appのリファレンスはもう有効ではありません。 – kism3t

+0

うん。 Windowsには別のオプションがあります。また、システムパラメータとしてPIDを送信することはお勧めしませんが、それはハートビートやRMI/Webサービスの呼び出しとして送信する必要があります。 Webサーバーがプロセスを再起動する可能性があるためです。したがって、Diagnostic.exeを再起動すると、新しいプロセスIDの他のものに検索が通知されます。 –