0

Hive サーバーを起動するための小さなプログラムを作成しました。Hive サーバーを起動するコマンドは、シェル ファイルにあります。シェル ファイルを呼び出して Hive サーバーを起動すると、起動してハングする傾向があります。プログラムに問題はありませんか?

コード:

            try
        {
            String cmd = "/home/hadoop/sqoop-1.3.0-cdh3u1/bin/StartServer.sh"; // this is the command to execute in the Unix shell

            // create a process for the shell
            ProcessBuilder pb = new ProcessBuilder("bash", "-c", cmd);
            pb.redirectErrorStream(true); // use this to capture messages sent to stderr
            Process shell = pb.start();
            InputStream shellIn = shell.getInputStream(); // this captures the output from the command
            // wait for the shell to finish and get the return code
            // at this point you can process the output issued by the command

            // for instance, this reads the output and writes it to System.out:
            int c;
            while ((c = shellIn.read()) != -1) 
            {
                System.out.write(c);
            }

            // close the stream
            shellIn.close();
        }
        catch(Exception e)
        {
            e.printStackTrace();
            e.printStackTrace(pw);
            pw.flush();
            System.exit(1);
        }

これを教えてください。プログラムで見逃したものはありますか?

ありがとう。

4

2 に答える 2

2

あなたのプログラムは、あなたが指示したことを実行しているようです。

最初の数行で実際に Hive サーバーを起動する必要があります。その後の行は、サーバー プロセスの標準出力から読み取られ、各文字が Java プロセスのコンソールにエコーされます。Hive サーバーの出力ストリームが存在する限り、Java プロセスはループ (ブロッキング I/O 呼び出しを行う) にとどまります。

つまり、Hive サーバーが実行されている限り、Java プロセスはループに留まり、出力をエコーし​​ます。

これはあなたがやりたいことですか?もしそうなら、それは明らかに終了できません。そうでない場合は、サーバーの入力ストリームから読み取る必要はまったくなく、Java プログラムはサーバー プロセスを開始した後に終了できます。または、 Java プロセスで出力をリッスンして他の処理を行う場合は、一度に 2 つの処理を行うために複数のスレッドを使用する必要あります

于 2012-05-03T10:45:32.120 に答える
1

私が見る限り、あなたはサーバーを起動しています。つまり、起動してすぐに終了しないアプリケーションです。実行中のままです。これは、このアプリケーション (サーバー) の STDOUT が閉じられていないことを意味します (サーバーを強制終了しない限り)。

メソッドshellIn.read()がブロックされています。入力ストリームから次のバイトを読み取り、バイトが読み取られるか、ストリームが閉じられると戻ります。

したがって、あなたの場合、ストリームは決して閉じられないため、プログラムは動かなくなりました。入力を永遠に待っています (そしておそらくそれを読んでいます)。

この問題を解決するには、別のスレッドが必要です: Java または OS のいずれかです。別の Java スレッドからサーバーを実行するか、コマンド ラインを構成してサーバーをバックグラウンドで実行できます (たとえば、末尾の & を使用)。

于 2012-05-03T10:45:19.403 に答える