Spring批处理 - 在读取器和处理器之间传递值

时间:2017-11-21 12:20:32

标签: spring spring-batch

我有一个要求,我需要从xls读取值(其中存在名为netCreditAmount的列)并将值保存在数据库中。要求是从所有行添加netCreditAmount的值,然后在数据库中仅为xls中的第一行设置此总和,并插入剩余的行及其对应的netCreditAmounts。 我应该如何继续Spring Batch中的实现。正常的读者,处理器和编写器工作正常,但我应该在哪里插入此实现? 谢谢!

2 个答案:

答案 0 :(得分:0)

那么问题是什么? 您需要设置批处理作业步骤以使用reader-processor-writer。

Reader有界面:

public interface ItemReader<T> {    
  T read();
}

处理器:

public interface ItemProcessor<I, O> {
  O process(I item);
}

那么读者需要提供相同类型的内容 - T;并将其传递给处理器 - I

stepBuilderFactory.get("myCoolStep")
            .<I, O>chunk(1)
            .reader(myReader)
            .processor(myProcessor)
            .writer(myWriter)
            .build();

答案 1 :(得分:0)

Yo可以通过添加额外的tasklet来解决这个问题。 工作流程可以如下所示

@Bean
    public Job myJob(JobBuilderFactory jobs) throws Exception {
        return jobs.get("myJob")
                .start(step1LoadAllData())  // This step will load all data in database excpet first row in xls
                .next(updateNetCreditAmountStep()) //// This step will be a tasklet. and will update total sum in first row. You can use database sql for sum for this 
                .build();           

    }

Tasklet将如下所示

@Component
public class updateNetCreditAmountTasklet implements Tasklet {  

    @Override
    public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext)
            throws Exception {
            Double sum = jdbctemplate.queryForObject("select sum(netCreditAmount) from XYZ", Double.class);
         // nouw update this some in database for first row 
        return null;
    }

}