Spring Batch-有条件地从数据库中读取

时间:2018-10-11 14:14:37

标签: spring-boot spring-batch

这是我在SpringBatch中使用SpringBoot的第一个代码,我正在实现一个示例用例。

这是我想在SpringBatch中实现的确切伪代码,请您帮忙:

一次获取所有酒店详细信息(> 300万条记录)并进行处理是不可行的,因此我决定一次获取1家酒店(50,000条记录)并进行处理并将其写入数据库。想要对每个hotelID重复此步骤,如下所述。这个用例适合SpringBatch吗?

List<Integer> allHotelIDs = execute("select distinct(hotelid) from Hotels"); 

List items = new Arraylist();
allHotelIDs.forEach(hotelID -> {
    Object item = itemReader.jdbcReader(hotelID, dataSource);
    Object processedItem = itemProcessor.process(item);
    items.add(processedItem);
});
itemWriter.write(items);

我只能传递1个hotelid,如何为所有列出的酒店多次调用它?

@Bean
Job job(JobBuilderFactory jbf, StepBuilderFactory sbf, DBReaderWriter step1) throws Exception {

  Step db2db = sbf.get("db-db").<Table, List<Tendency>>chunk(1000)
      .reader(step1.jdbcReader(hotelID, dataSource))
      .processor(processor())
      .writer(receivableWriter()).build();

  return jbf.get("etl").incrementer(new RunIdIncrementer()).start(db2db).build();
}

阅读器代码:

@Configuration
public class DBReader {
  @Bean
  public ItemReader<Table> jdbcReader(Integer hotelID, DataSource dataSource) {
    return new JdbcCursorItemReaderBuilder<Table>().dataSource(dataSource).name("jdbc-reader")
        .sql("SELECT * FROM Hotels where hotelid ="+hotelID).rowMapper((rs, i) -> {
          return read().db(rs, "Hotels");
        }).build();
  }
}

谢谢。

0 个答案:

没有答案