アイテムのリストに対して繰り返す必要のあるバッチジョブがあります。したがって、バッチレットステップを使用してリストをロードし、リスト内の各IDの子ジョブを開始する「親」ジョブがあります。各子ジョブはJobOperatorを使用して起動され、paramはPropertiesクラスを使用して起動されます。これは期待どおりに正常に機能します。
リストを反復処理するには、バッチステータスを取得し、子ジョブが完了するのを待つ必要があります。JobExecutionクラスを使用してバッチステータスまたは終了ステータスを取得しようとしていますが、JobExecutionは子ジョブのバッチステータスを取得していません。
代わりに、STARTED
子ジョブが完了した後でも、常にのバッチステータスが表示されます。
私のコードは次のようになります:
for (int i = 1; i <= rsList; i++) {
long execId = jobOperator.start("gah-history-chunk-archive-job",jobParamProperties);
JobInstance jobInstance = jobOperator.getJobInstance(execId);
JobExecution jobExecution = jobOperator.getJobExecution(execId);
logger.info("Instance id: "+jobInstance.getInstanceId());
while(!jobExecution.getBatchStatus().toString().equals("COMPLETED") || !jobExecution.getBatchStatus().toString().equals("FAILED")) {
//Both batch status and exit status giving the status of this batchlet, not giving the status of gah-history-chunk-archive-job
logger.info("Batch status is: "+jobExecution.getBatchStatus() +" Thread is sleeping for 5 seconds");
logger.info("Exit status:"+jobExecution.getExitStatus());
Thread.sleep(300);
}
}
バッチレットから起動された子ジョブのバッチまたは終了ステータスを取得する方法を知りたい。なぜBatchStatusが表示され続けるのSTARTED
ですか?
ステータスを「ポーリング」するには、ステータスJobExecution
を確認するたびにJobOperatorから新しいインスタンスを取得する必要があります。したがって、JobExecutionをwhileループの外側ではなく、内側に取得します。
したがって、たとえば次のようになります。
do {
Thread.sleep(300);
// log or whatever
BatchStatus status = jobOperator.getJobExecution(execId).getBatchStatus();
} while(status != BatchStatus.COMPLETED && status != BatchStatus.FAILED) ;
ここでの動作は仕様によって標準化されていないため、これは少し注意が必要です。
この仕様では、さまざまなジョブリポジトリの実装(データベース、単純なメモリ内マップなど)が許可されているため、「キャッシュされた」JobExecutionに特定の動作を必要とせず、「元のコードで動作する場合があります。
実際に表示されているのは、返される「親」オブジェクトインスタンスではないと思います。期待したものが見えないので混乱しているのではないかと思います。
いずれにせよ、コードの移植性を高めるためにJobExecution
、各ステータスチェックでを取得してください。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加