0

私はバットファイルを呼び出すJavaコードを持っています。このbatファイルには、txtファイルからテーブル(Oracle内)にデータをロードするsqlldrへの呼び出しが含まれています。これは、bat ファイルを呼び出すための Java コードです。

ProcessBuilder pb = new ProcessBuilder(new File(".").getAbsolutePath()
                + File.separator + "ld.bat");
        System.out.println("Before start");
Process start;
            try {
                start = pb.start();


        } catch (IOException e) {

            e.printStackTrace();
        } 

このコードの下で、新しいスレッドを作成し、他のタスクを実行しています。データのロードはバックグラウンドで行われます。ロードが完了したら、何らかのタスク (たとえば、txt データ ファイルを別の場所に移動する) を実行したいと考えています。sqlldr によってデータのロードが完了したら、通知を受け取る方法はありますか。回避策に出くわしました-dテーブルの行数をチェックし続け、生のtxtファイルの行数と比較できます。しかし、これに対する別の解決策があるかどうか知りたいです。start.waitFor() また、他の活動が保留になるため、使用したくありません。

4

3 に答える 3

1

あなたの質問を完全に理解しているかどうかはわかりません.バッチスクリプトの呼び出しを新しいスレッドに入れることができない理由はありますか?

例えば

new Thread("Load Data"){
  @Override
  public void run() {
    // load data
    // move txt data file
  }
}.start();

// do other activities 
// (Presumably they're not dependent on the data having been loaded...)
于 2012-05-25T08:23:37.933 に答える
0

これは、すでにテスト済みの正確なソリューションです。

sqlldr が開始されると、以下のコードは終了するまで待機し、「some business」を実行します。

    Runtime rt = Runtime.getRuntime();
    Process proc = rt.exec(sqlldrRunCmd);
    int exitVal = proc.waitFor();
    System.out.println("Process exitValue: " + exitVal);

    // some business in here
于 2013-10-05T23:32:53.173 に答える
0

私は同じ問題を抱えており、次のように解決しました:

 public void runSqlldr() throws IOException, Exception {
        String sqlldrRunCmd = StartParserEngineHW3G2G.SQLLDRPATH
                + " userid='" + DBHelper.username + "/" + DBHelper.password + "@" + StartParserEngineHW3G2G.TNSNAME + "'"
                + " control='" + this.ctlFile.getAbsolutePath() + "'"
                + " log='" + this.logFile.getAbsolutePath() + "'"
                + " direct=true rows=1000000 errors=1000000000";
    Runtime rt = Runtime.getRuntime();
    Process proc = rt.exec(sqlldrRunCmd);

    while(true){
        if(logFile.exists() && logFile.length() > 0){
            System.out.println(logFile + " is exist and sqlldr completed and lentgh is " + logFile.length());
            proc.destroy();
            break;
        }
        else{
            System.out.println(logFile + " is not exist, and waiting and logfile length is " + logFile.length());
            Thread.sleep(3000);
        }

    }
}
于 2013-10-05T22:25:10.393 に答える