【Java】 外部プログラム/コマンド実行でタイムアウト設定するには...

はじめに

http://blogs.yahoo.co.jp/dk521123/34842155.html
で、 外部プログラム/コマンドを実行する事を行ったが、
もし、その処理が重く時間が掛かる場合、タイムアウトを設定して中断することも考えなくてはならない。

そこで、今回は、タイムアウト処理を加える。

タイムアウト設定について

■ Java1.8

http://www.ne.jp/asahi/hishidama/home/tech/java/process.html#Process_waitFor_timeout
によると、以下のように簡単に実装できるらしい

boolean isDone = process.waitFor(10, TimeUnit.SECONDS);
補足
 * Java1.8では、他にも「process.isAlive()」など便利なメソッドが追加されている

■ Java1.7

http://chipmunkland.blog104.fc2.com/blog-entry-197.html
を参考に実装してみる

サンプル

以下の関連記事のサンプルを修正している
http://blogs.yahoo.co.jp/dk521123/34842155.html
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Sample {
   private final static int Success = 0;
   private final static long Timeout = 10000;

   public static void main(String[] args) {
      try {
         ProcessBuilder processBuilder = new ProcessBuilder(
               "C:/Program Files/PostgreSQL/9.3/bin/pg_dump.exe", "-Fc", "-b",
               "-U", "postgres", "-f", "C:/temp/dump.out", "postgres");
         // Merge Standard errors into Standard outputs
         processBuilder.redirectErrorStream(true);
         Process process = processBuilder.start();

         try (InputStreamReader inputStreamReader = new InputStreamReader(
               process.getInputStream());
               BufferedReader bufferedReader = new BufferedReader(
                     inputStreamReader)) {
            boolean isDone = false;
            long startTime = System.currentTimeMillis();
            while (System.currentTimeMillis() - startTime < Timeout) {
               if (inputStreamReader.ready()) {
                  inputStreamReader.read();
               }
               try {
                  int exitValue = process.exitValue();
                  System.out.println("Exit Value : " + exitValue);
                  if (exitValue == Success) {
                     System.out.println("Success!");
                  } else {
                     System.out.println("Failed...");
                     String errorMessage;
                     while ((errorMessage = bufferedReader.readLine()) != null) {
                        System.out.println(errorMessage);
                     }
                  }
                  // The Process is done.
                  isDone = true;
                  break;
               } catch (IllegalThreadStateException ex) {
                  // The process is still running.
                  Thread.sleep(100);
               }
            }
            if (!isDone) {
               process.destroy();
            }
         }
         System.out.println("Done ");
      } catch (Exception ex) {
         ex.printStackTrace();
      }
   }
}


関連記事

Java】外部プログラム/コマンドを実行するには ~ ProcessBuilder ~

http://blogs.yahoo.co.jp/dk521123/34842155.html