Spring-boot集成spring-batch传参数时一般方法为:
@Bean("step1Reader")
public JdbcPagingItemReader<T> step1Reader(DataSource dataSource) {
Map<String, Order> sortKeys = Maps.newHashMap();
sortKeys.put("id", Order.ASCENDING);
Map<String, Object> params = Maps.newHashMap();
params.put("date", DateUtil.getUTC8LocalDateTime().toDate());
return new JdbcPagingItemReaderBuilder<T>()
.fetchSize(readFetchSize)
.selectClause("select *")
.fromClause("from test")
.whereClause("where credit_time < :date")
.parameterValues(params)
.sortKeys(sortKeys)
.saveState(false)
.rowMapper(new BeanPropertyRowMapper<T>())
.dataSource(dataSource)
.name("step1Reader")
.build();
}
此时,返回值JdbcPagingItemReader中的参数“date”是一个定值,并不会随着日期的推进变化。
所以可以通过jobParameters来进行传参
new JobParametersBuilder()
.addString("date", DateUtil.getUTC8LocalDateTime().toDate().toString())
.toJobParameters();
@Bean("step1Reader")
@StepScope
//Spring Batch提供了一个特殊的bean scope类(StepScope:作为一个自定义的Spring bean scope)。这个step scope的作用是连接batches的各个steps。这个机制允许配置在Spring的beans当steps开始时才实例化并且允许你为这个step指定配置和参数。
public JdbcPagingItemReader<T> step1Reader(@Value("#{jobParameters[date]}") String date, DataSource dataSource) {
Map<String, Order> sortKeys = Maps.newHashMap();
sortKeys.put("id", Order.ASCENDING);
Map<String, Object> params = Maps.newHashMap();
return new JdbcPagingItemReaderBuilder<T>()
.fetchSize(readFetchSize)
.selectClause("select *")
.fromClause("from test")
.whereClause("where credit_time < date('"+date+"')")
.parameterValues(params)
.sortKeys(sortKeys)
.saveState(false)
.rowMapper(new BeanPropertyRowMapper<T>())
.dataSource(dataSource)
.name("step1Reader")
.build();
}
3.调用
//使用null调用
//https://blog.codecentric.de/en/2013/06/spring-batch-2-2-javaconfig-part-2-jobparameters-executioncontext-and-stepscope/
step1Reader(null, dataSource);