3

全て、

私はもともと、SQLLoader (Oracles データ アップロード ツール) を呼び出すシェル スクリプトを持っていました。

問題は、SQLLoader がプレーン テキストのパスワードを入力として受け取ることでした。そのため、復号化されたパスワードをコマンド文字列に渡して内部的に SQLLoader を呼び出す Java アプリケーションを作成することにしました。

例えば

sqlldr user/pass@DBServer control=../sqlloader.ctl ログ=sqlloader.log データ=mydata.csv

したがって、私のJavaラッパーでは、シェルスクリプトでこれになりました

java -jar sqlloader.jar sqlloader.ctl mydata.csv

しかし、ロードするファイルがないと SQLLoader が訴えると、新たな問題が発生しました。頭を悩ませた後、Java アプリケーションがまだ実行されている間に、シェル スクリプトの後続のコマンドが実行されているように見えることがわかりました。したがって、非同期で動作していました。

次のコマンドは、sqlloader が使用する機会を得る前に、使用していた入力ファイルを移動することでした。そこで、20 秒以内にスリープ コマンドを実行して、Java アプリケーションの実行時間を確保しました。

java -jar sqlloader.jar sqlloader.ctl mydata.csv
echo $?
sleep 20
if [ $? -ne 0 ]
    then
        echo "SQLLoader failed during execution, please check the log : " 
        mv mydata.csv

else
    echo "SQLLoader successfully processed file : "
    mv mydata.csv
fi

Unixがこのように動作する理由を誰かが知っていますか?Javaは私のSQLLoaderを別のユーザー/スレッドとして実行しますか?

これは私のJavaコードです:

    Runtime Rt;
Process Prc;
    Prc = Rt.exec("sqlldr user/decryptedpass@DBServer control=../sqlloader.ctl log=sqlloader.log data=mydata.csv);
system.exit(0);

非同期であることについてランタイムクラスをチェックしましたが、何も見つかりませんでした

http://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html

理論や提案はありますか?

ありがとう

4

2 に答える 2

2

プロセスの完了を待つ必要があります。開始しているプロセスからのすべての出力 (stdoutおよびstderr) も読み取る必要があります。

exec() の後に exit() を呼び出すと、Java はまさにそれを行います - すぐに終了します。

Runtime.exec の落とし穴を説明する記事は次のとおりです: http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=4 (他のページも考慮してください)。

于 2013-11-07T12:05:18.947 に答える