したがって、私のシナリオの本質を掘り下げると、次のようになります。基本的に、結果セットを CSV ファイルとしてエクスポートする必要がある一連の SQL クエリを含む構成ファイルがあります。一部のクエリは数十億行を返す可能性があり、何かがプロセスを中断する可能性があるため (バグ、クラッシュなど)、Spring Batch などのフレームワークを使用して、再起動可能性とジョブ監視を提供します。Springバッチジョブを永続化するために、ファイルベースのH2データベースを使用しています。
だから、ここに私の質問があります:
ジョブを作成したら、RowMapper にいくつかの初期構成を提供する必要があります。では、クラッシュなどの後にジョブを再起動する必要がある場合はどうなるでしょうか? 具体的には:
- RowMapper の状態は自動的に永続化され、再起動時に Spring バッチはデータベースからオブジェクトを復元しようとします。または
- 元の Spring バッチ XML 構成ファイルの一部である RowMapper オブジェクトが使用されるか、または
- ステップ/ジョブの ExecutionContext を使用して RowMapper の状態を維持する必要がありますか?
上記の質問は、Spring バッチ XML 構成を使用するときに魔法が起こっているかどうか、またはこれらすべての Bean をプログラムで作成できるかどうかに関連しています。独自の構成フォーマットを Spring バッチ ジョブ構成に解析する必要があるため、有効な XML を手動で書き出そうとするのではなく、Spring Batch の Java クラス (Bean) を使用して適切に入力するだけです。ただし、ジョブがクラッシュした場合は、すべての Bean を自分で再度作成します。春のバッチはデータベースからジョブの状態を自動的に復元しますか?
本当に XML が必要な場合、スプリング バッチ JobRepository (またはこれらのオブジェクトの 1 つ) をスプリング バッチ XML 構成としてシリアル化する方法はありますか?
現在、次のコードを使用してステップを構成しようとしましたが、これが適切な方法であるかどうかはわかりません。
- TaskletStep は進むべき道ですか?
- チャンクされたリーダー/ライターを作成する方法は正しいですか、それとも代わりに使用する必要がある他のオブジェクトがありますか?
JobExecution の一部としてリーダーとライターが自動的に開かれると想定していましたが、ジョブを実行する前にこれらのリソースを開かないと、まずそれらを開く必要があることを示す例外が発生します。リソース (jdbc 接続とファイルハンドル) を管理する別のオブジェクトを作成する必要があるのでしょうか?
JdbcCursorItemReader<Foobar> itemReader = new JdbcCursorItemReader<Foobar>(); itemReader.setSql(sqlStr); itemReader.setDataSource(dataSource); itemReader.setRowMapper(rowMapper); itemReader.afterPropertiesSet(); ExecutionContext executionContext = new ExecutionContext(); itemReader.open(executionContext); FlatFileItemWriter<String> itemWriter = new FlatFileItemWriter<String>(); itemWriter.setLineAggregator(new PassThroughLineAggregator<String>()); itemWriter.setResource(outResource); itemWriter.afterPropertiesSet(); itemWriter.open(executionContext); int commitInterval = 50000; CompletionPolicy completionPolicy = new SimpleCompletionPolicy(commitInterval); RepeatTemplate repeatTemplate = new RepeatTemplate(); repeatTemplate.setCompletionPolicy(completionPolicy); RepeatOperations repeatOperations = repeatTemplate; ChunkProvider<Foobar> chunkProvider = new SimpleChunkProvider<Foobar>(itemReader, repeatOperations); ItemProcessor<Foobar, String> itemProcessor = new ItemProcessor<Foobar, String>() { /* Custom implemtation */ }; ChunkProcessor<Foobar> chunkProcessor = new SimpleChunkProcessor<Foobar, String>(itemProcessor, itemWriter); Tasklet tasklet = new ChunkOrientedTasklet<QuadPattern>(chunkProvider, chunkProcessor); //new SplitFilesTasklet(); TaskletStep taskletStep = new TaskletStep(); taskletStep.setName(taskletName); taskletStep.setJobRepository(jobRepository); taskletStep.setTransactionManager(transactionManager); taskletStep.setTasklet(tasklet); taskletStep.afterPropertiesSet(); job.addStep(taskletStep);