2017-10-26 8 views
3

質問:春のブートプロジェクトでwebserviceからjava jarファイルを実行します。それを監視したいと考えています。spring webserviceとmonitorからプロセスを実行しますか?

問題:私はこのプロセスを実行することができますが、問題はプロセスがそれ以上処理しなかったことです。

このプロセスがなぜ待っているのか、なぜ処理されていないのかを知りたい。どのように私はその進歩を監視することができます。

そのは、以下の条件で処理されます:私は春ブーツプロジェクトやTomcatを停止すると

  1. 。私はthisから解決策を試してみましたprocess.waitFor();

削除する場合

  • そのは処理されます、それはまた別のスレッドからの処理を実行します。高度で

    私のWebサービスの呼び出し

    @RequestMapping(value="/startAnalysis", method=RequestMethod.POST) 
    public String startAnalysis() { 
        List<String> cmd = new ArrayList<>(); 
        cmd.add("java"); 
        cmd.add("-jar"); 
        cmd.add("test.jar"); 
        try { 
          //Process p = Runtime.getRuntime().exec(cmd.toArray(new String[0])); 
    
          //ProcMon procMon = new ProcMon(cmd); 
          //Thread t = new Thread(procMon); 
          //t.setName("procMon"); 
          //t.start(); 
    
          ProcessBuilder processBuilder = new ProcessBuilder(cmd); 
          Process process = processBuilder.start(); 
          process.waitFor(); 
    
        } catch (Exception e) { 
         e.printStackTrace(); 
        } 
        return "success"; 
    } 
    

    感謝。

  • +0

    私はプロセスを開始するので、そのプロセスの入力ストリームを読むことが重要ですか?私はそれを読んでいないと、プロセスは何かを待つことに気付いた。 – swan

    +0

    サーバ外でコマンドラインから同じjar実行ファイルを実行しようとしましたか?それはその後終了するのですか? –

    答えて

    1

    多くの場合、プロセスは、呼び出しプロセスによって出力が消費されるのを待機します。時にはこれは単純に出力が端末に表示されることを意味しますが、この場合、ブロックするまで入力ストリームを読む必要があります。プロセスの振る舞いがわからない場合は、別のスレッドでprocess.getInputStream()を読み込みたいかもしれません。また、あなたのプロセスが何らかの状態でprocess.getOutputStream()に書き込まれるのを待っている可能性もあります。

    jarファイルのドキュメントを確認するか、コマンドプロンプト/シェルから直接実行して、その動作を確認する必要があります。次に、動作を期待どおりに出力を読み取るようにアプリケーションを変更することができます。

    は、多くのアプリケーションでは、出力は、最も簡単にライン・バイ・ラインを読まれる:

    final String EXPECTED_OUTPUT = "Hello World"; 
    
    BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); 
    String firstLine = reader.readLine(); 
    if (!firstLine.equals(EXPECTED_OUTPUT)) { 
        // handle unexpected situation 
    } 
    // maybe handle some more output 
    // or send something to the process.getOutputStream() in response 
    // and finally wait for the application to exit when it should be done 
    process.waitFor(); 
    
    0

    process.waitFor()への呼び出しは、いくつかのケース、hereに全く返さないなぜの精巧な推論を見つけてください。

    また、のalternate versionメソッドを使用してtimeOut値を指定できるかどうかを確認してください。

    関連する問題