【Spring-boot】spring-batch传参数问题

南门向荣
2023-12-01

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来进行传参

  1. 设置jobParameters
new JobParametersBuilder()
                    .addString("date", DateUtil.getUTC8LocalDateTime().toDate().toString())
                    .toJobParameters();
  1. 取参数
	@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);
 类似资料: