Java プログラムで PostgreSQL サーバーを起動したいと考えています。このタスクでは、次のコードを使用しています。
ProcessBuilder pb = new ProcessBuilder(pgHome + "/bin/pg_ctl", "start");
Map<String, String> env = pb.environment();
env.put("PGDATA", pgDataDir);
Process p = pb.start();
InputStream is = p.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String line;
boolean started = false;
while (!started && (line = reader.readLine()) != null) {
started = line.contains("database system is ready to accept connections");
}
if (!started) {
throw new IllegalStateException("Unable to start PostgreSQL server");
}
同じオプションを使用してコマンド ラインで postgres サーバーを起動すると、次のメッセージが表示されます。
server starting
LOG: database system was shut down at 2013-02-08 09:07:50 CET
LOG: autovacuum launcher started
LOG: database system is ready to accept connections
コマンドが戻る前に、最初の行 (サーバーの開始) が出力されます。以降のすべての行は、バックグラウンド プロセスによって出力されます。
私の Java コードは最初の行しか表示しませんが、LOG メッセージを解析したいと考えています。このようなバックグラウンド プロセスの入力を読み取る方法はありますか?
また、奇妙で再現性のない動作にも遭遇しました。コードをデバッグすると、LOG ステートメントを含む出力が完全に解析されます。最初はタイミングの問題だと思いましたが、プロセスを開始してから待ってもこれは変わりませんでした。