をスケジュールするために、私は春のブートバッチアプリケーションがあります。また、@EnableBatchProcessing
で注釈さ@Configuration
クラスでどのように春のブートバッチ・アプリケーション
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class LoadApplication {
public static void main(String[] args) {
SpringApplication.run(LoadApplication.class, args);
}
}
を、私は次のバッチジョブBeanが定義されています:
@Bean
public Job loadJob(JobBuilderFactory jobs, Step stepLoadFile, Step stepArchiveFile) {
return jobs.get("loadJob")
.incrementer(new RunIdIncrementer())
.start(stepLoadFile)
.next(stepArchiveFile)
.build();
}
を
バッチジョブのstepLoadFile
はフラットファイル(下記参照)を読み取り、そのファイルデータをデータベースに書き込みます。 stepArchiveFile
は、ファイルを別のディレクトリに移動します。
通常、ジョブは指定した時刻に1日に1回(火曜日〜土曜日)実行する必要があります。しかし、フラットファイルが見つからない場合、ジョブは失敗し、成功するか最大試行回数(例えば5回)になるまで30分ごとに再実行する必要がある。再実行が成功すると、次の通常の実行時間までジョブは再び実行されません。また、システムは理想的には同じジョブの同時実行を防止する必要があります。どのようにしてこれを行うことができますか?
注:再実行では、直前のジョブの実行が失敗した場所を選択する必要はありません。これは、チャンクサイズがファイル内の項目数より大きく設定されているためです。
私は私の@Configuration
クラス(注:私は、構成およびメインクラスに@EnableRetry
を追加しました):でこれを試してみました
@Bean
public ItemReader<Test> reader(LineMapper<Test> lineMapper, ApplicationProperties properties) {
FlatFileItemReader<Test> flatFileItemReader = new FlatFileItemReader<Test>() {
@Override
@Retryable(value = {ItemStreamException.class}, maxAttempts=5)
public void open(ExecutionContext executionContext) throws ItemStreamException {
super.open(executionContext);
}
@Override
@Retryable(maxAttempts=5)
public Holding read() throws UnexpectedInputException, ParseException, Exception {
return super.read();
}
};
flatFileItemReader.setResource(new FileSystemResource(properties.getLoadFile()));
flatFileItemReader.setLineMapper(lineMapper);
return flatFileItemReader;
}
ItemStreamException
は再試行せずにスローされ、アプリケーションが終了されます。再試行が手順を失敗したため
応答をありがとう。残念ながら、私はこれが私が必要とするものを達成するとは思わない。ジョブは、通常、1日に1回だけ実行する必要があります。 '@ Scheduled'では、30分ごとに実行されます。ジョブが失敗した場合、成功するまで30分ごとに再実行する必要があります。 'retry-limit'では、30分待たずに直ちに再試行すると思います。また、「再試行制限」は仕事レベルではなくアイテムレベルにあるとも考えています。これらの点のいずれかが間違っている場合は、私を修正してください。 – James