0

ジョブリスナーを使用しない春のバッチジョブが完了したかどうかを判断するための最良の方法を探しています。私はjsr準拠のコンポーネントを使用しています。ジョブ リスナーがない理由は、エンド ユーザーがジョブを正しく定義してリスナーを含めることに依存したくないからです。

これまでに思いついた唯一のアプローチは、これを開始/再起動を呼び出しているクラスに入れることです

        executionID = jobOperator.start(jobName, properties);

        BatchStatus status = jobOperator.getJobExecution(executionID).getBatchStatus();
        while(status != BatchStatus.ABANDONED && status != BatchStatus.COMPLETED && status != BatchStatus.FAILED &&
                status != BatchStatus.STOPPED){
            Thread.sleep(1000);
            status = jobOperator.getJobExecution(executionID).getBatchStatus();
        }

私がここで抱えている問題は、これがデータベースにクエリを実行することであり、かなり長時間実行されているジョブでは、ステータスを取得するために何千回もデータベースにクエリを実行できます。より良いアプローチがあるはずです。オペレーターまたはその他のオブジェクトがデータベースにアクセスすることなくジョブの現在のステータスを取得できるメモリ内の場所。あるいは、ジョブ仕様で定義することなくコールバックを行う方法かもしれません。

4

1 に答える 1

0

ジョブ リスナーを親ジョブ XML に配置し、すべてのジョブ XML から継承するのはどうでしょうか。この例の前半のようなもの: https://blog.codecentric.de/en/2013/06/spring-batch-2-2-javaconfig-part-4-job-inheritance/

Job Listener をすべてのジョブ XML に配置するのは見落としがちですが、親ジョブ XML を設定する方が優れており、保守も簡単だと思います。

于 2015-09-11T23:32:15.633 に答える