私は春のバッチ用にJava設定(spring-boot)を使用しています。私は従業員IDのリストを持っており、IDごとに(以下のように)クエリを実行してからデータを処理する必要があります。JdbcCursorItemReaderを使用した動的SQLクエリ
select * from history where employee_id = ?
私たちは、動的上記SQLでパラメータを設定するreader.setPreparedStatementSetter
を使用することができます理解しています。しかし、リスト内の従業員IDごとにバッチ処理をどのように繰り返すことができるかわかりません。 reader()を@StepScopeとしてマークしても、リーダーは一度だけ呼び出されます。 (すなわち)、バッチは1回だけ実行されます。どんな助けもありがとうございます。
List employeeIds = new ArrayList();
employeeIds.add(1);
employeeIds.add(2);
@Bean
@StepScope
public ItemReader<History> reader() {
JdbcCursorItemReader<History> databaseReader = new JdbcCursorItemReader<>();
databaseReader.setSql("select * from history where employee_id = ?");
databaseReader.setPreparedStatementSetter(..);
....
return databaseReader;
}
@Bean
public Step step(StepBuilder stepBuilder){
return stepBuilderFactory.get("sample").
.reader(reader())
.processor(processor())
.writer(writer())
.build();
}
これは一般的なパターンです(http://docs.spring.io/spring-batch/reference/html/patterns.html#drivingQueryBasedItemReaders)。あなたのリーダーはIDリストからIDを返し、あなたの現在のリーダーはプロセッサーに変換する必要があります –
うーん、1つのItemReaderを複数のItemProcessorsにマップできますか?なぜなら、元のリストのすべてのIDに対してItemProcessorを実行したいからです。 –
はい、複合アイテムプロセッサ(http://docs.spring.io/spring-batch/apidocs/org/springframework/batch/item/support/CompositeItemProcessor.html) –