2016-05-11 7 views
2

javaのpg_dumpを使用して自分のデータベースのバックアップを作成します。バックアップの作成はうまくいきますが、プログラムが終了する前に開始されません。ProcessBuilder経由でpostgresqlのバックアップを作成します。

バックアップをすぐに開始する方法はありますか?

public static void backupDb() throws IOException, InterruptedException { 
    String path = "C:\\HACENE\\test.backup"; 
    Runtime r = Runtime.getRuntime(); 
    //PostgreSQL variables  
    String host = "localhost"; 
    String user = "postgres"; 
    String dbase = "gtr_bd"; 
    String password = "postgres"; 
    Process p; 
    ProcessBuilder pb; 

    r = Runtime.getRuntime(); 
    pb = new ProcessBuilder("C:\\Program Files\\PostgreSQL\\9.3\\bin\\pg_dump", "-v", "-h", host, "-f", path, "-U", user, dbase); 
    pb.environment().put("PGPASSWORD", password); 
    pb.redirectErrorStream(true); 
    p = pb.start(); 
    System.out.println("end of backup"); 
} 
+4

'p.waitFor()'おそらく? – CollinD

+0

動作はOS環境によって異なります。プロセスの実行はJava自体では行われません。したがって、定義して実行するために渡したプロセスを実際に実行するのは、OSによって異なります。また、プログラムのexit_(ミリ秒、秒、時間)の前にはどれくらいの時間がありますか? – rpy

+0

プロセスはosによって処理されるので、論理的にはアプリケーションから起動する必要がありますが、プログラムを終了するとプロセスが正確に開始されます –

答えて

0

あなたはProcessBuilder.start()から返さProcessインスタンスの状態を確認する必要があります。コメントですでに述べたように、Process.waitFor()メソッドを使用すると、プロセスが終了するまで待つことができます。さらに、起動したプロセスの終了値を調べて、バックアップが成功したかどうかを判断することを検討する必要があります。

これは私が私のプロジェクトでやったことです:

private void validateExitValue(final Process aProcess, final String aCommand, 
    final String aResult) throws IllegalStateException { 
    do { 
     try { 
      if (aProcess.waitFor() != 0) { 
       final String errorMessage = String.format("Command '%s' terminated with exit status '%s': %s", 
        aCommand, aProcess.exitValue(), aResult); 
       throw new IllegalStateException(errorMessage); 
      } 
      break; 
     } catch (final InterruptedException e) { 
      Thread.currentThread().interrupt(); 
     } 
    } while (true); 
} 

プロセスが0以外の終了コードで終了した場合、このメソッドは、IllegalStateExceptionを終了し、スローするプロセスを待ちます。

あなたのJavaプログラムが終了するのと同じようにバックアッププロセスが現在開始されているという観測は、バックアッププロセスを開始するとJavaプログラムによって実行される可能性が最も高いと思われます。外部プロセスの起動にはしばらく時間がかかり、プログラムは継続して終了します。つまり、Javaプログラムの終了時にプロセスが開始されているように見えます。

0
// Comment -> p = pb.start(); 
// add this at the end: 

final Process process = pb.start(); 
InputStream is = process.getInputStream(); 
InputStreamReader isr = new InputStreamReader(is); 
BufferedReader br = new BufferedReader(isr); 
String line; 
while ((line = br.readLine()) != null) { 
    System.out.println(line); 
} 
// because you put "-v" in your command. Another way is to remove "-v" from your command 

-v冗長モードを指定します。これにより、pg_dumpは詳細なオブジェクトコメントと開始/終了時刻をダンプファイルに出力し、メッセージを標準エラーに進めます。このLINK

0

からあなたは罰金cmdの中で、この作品を、このコマンドを実行する場合:

"C:\Program Files\PostgreSQL\9.3\bin\pg_dump.exe" -U postgres -h localhost -p 5432 database_name > "C:\Test\test.buckup" 

ですから、このような.BATファイルにこの行を置くことができます。

@echo off 
cd "C:\Program Files\PostgreSQL\9.3\bin\" 
pg_dump.exe -U postgres -h localhost -p 5432 bd_suivi > "C:\Test\test.buckup" 
exit 

そして、このファイルを実行します.batはjavaと同じように:

public static void main(String[] args) { 
    try { 
     ProcessBuilder builder = new ProcessBuilder("cmd.exe", "/c", "start script.bat"); 
     builder.redirectErrorStream(true); 
     Process p = builder.start(); 
     BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream())); 
     String line; 
     while (true) { 
      line = r.readLine(); 
      if (line == null) { 
       break; 
      } 
      System.out.println(line); 
     } 
     System.out.println("I finished the creation of the buckup!"); 
    } catch (Exception e) { 
     System.out.println("Exception = " + e); 
    } 
} 

幸運。

関連する問題