springspring-bootspring-batch

Spring Batch Annotated No XML Pass Parameters to Item Readere


I created a simple Boot/Spring Batch 3.0.8.RELEASE job. I created a simple class that implements JobParametersIncrementer to go to the database, look up how many days the query should look for and puts those into the JobParameters object.

I need that value in my JdbcCursorItemReader, as it is selecting data based upon one of the looked up JobParameters, but I cannot figure this out via Java annotations. XML examples plenty, not so much for Java.

Below is my BatchConfiguration class that runs job.

`

@Autowired
SendJobParms jobParms; // this guy queries DB and puts data into JobParameters

@Bean
public Job job(@Qualifier("step1") Step step1, @Qualifier("step2") Step step2) {
    return jobs.get("DW_Send").incrementer(jobParms).start(step1).next(step2).build();
}

@Bean
protected Step step2(ItemReader<McsendRequest> reader,
                     ItemWriter<McsendRequest> writer) {
    return steps.get("step2")
            .<McsendRequest, McsendRequest> chunk(5000)
            .reader(reader)
            .writer(writer)
            .build();
}


@Bean
public JdbcCursorItemReader reader() {
    JdbcCursorItemReader<McsendRequest> itemReader = new JdbcCursorItemReader<McsendRequest>();
    itemReader.setDataSource(dataSource);

// want to get access to JobParameter here so I can pull values out for my sql query.
    itemReader.setSql("select xxxx where rownum <= JobParameter.getCount()");
    itemReader.setRowMapper(new McsendRequestMapper());
    return itemReader;
}

`


Solution

  • Change reader definition as follows (example for parameter of type Long and name paramCount):

    @Bean
    @StepScope
    public JdbcCursorItemReader reader(@Value("#{jobParameters[paramCount]}") Long paramCount) {
        JdbcCursorItemReader<McsendRequest> itemReader = new JdbcCursorItemReader<McsendRequest>();
    
        itemReader.setDataSource(dataSource);
    
        itemReader.setSql("select xxxx where rownum <= ?");
    
        ListPreparedStatementSetter listPreparedStatementSetter = new ListPreparedStatementSetter();
        listPreparedStatementSetter.setParameters(Arrays.asList(paramCount));
        itemReader.setPreparedStatementSetter(listPreparedStatementSetter);
    
        itemReader.setRowMapper(new McsendRequestMapper());
        return itemReader;
    }