【问题标题】:How could I assign dynamic properties to a Spring Batch configuration?如何将动态属性分配给 Spring Batch 配置?
【发布时间】:2019-06-21 21:07:21
【问题描述】:

我有一个用例,我需要在 Spring Batch 配置 bean 中动态更改资源、列名、列位置和其他内容。这些作业将从JobLauncher 启动。

我已经构建了以下内容:

@Configuration
@EnableBatchProcessing
public class BatchConfiguration {

    public JobBuilderFactory jobBuilderFactory;
    public StepBuilderFactory stepBuilderFactory;

    //these are the properties i need to dynamically change
    private String[] names;
    private Resource inputResource;
    private String[] positions;
    private String tableName;
    private String columnNames;
    private String values;

    @Autowired
    public void setJobBuilderFactory(JobBuilderFactory jobBuilderFactory) {
        this.jobBuilderFactory = jobBuilderFactory;
    }

    @Autowired
    public void setStepBuilderFactory(StepBuilderFactory stepBuilderFactory) {
        this.stepBuilderFactory = stepBuilderFactory;
    }

    @Bean
    BatchConfigurer configurer(@Qualifier("prestagingJpaDataSource") DataSource dataSource){
        return new DefaultBatchConfigurer(dataSource);
    }


    @Bean
    public FlatFileItemReader<String[]> reader() {

        return new FlatFileItemReaderBuilder<String[]>()
                .name("hacReader")
                //put file here
                .resource(inputResource)
                .lineMapper(new DefaultLineMapper<String[]>() {{
                    setLineTokenizer(new DelimitedLineTokenizer() {{
                        //put column names here
                        setNames(names);
                    }});
                    //put column positions here
                    setFieldSetMapper(fieldSet -> positions);
                }})
                .build();
    }

    //this is obviously wrong, as i would need to use an ItemPreparedStatementSetter
    @Bean
    public JdbcBatchItemWriter<String[]> writer(DataSource dataSource) {
        return new JdbcBatchItemWriterBuilder<String[]>()
                .itemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>())
                .sql("INSERT INTO " + tableName + " (" + columnsNames + ") VALUES (" + values)
                .dataSource(dataSource)
                .build();
    }

    @Bean
    public Job importUserJob(JobCompletionNotificationListener listener, Step step1) {
        return jobBuilderFactory.get("importUserJob")
                .incrementer(new RunIdIncrementer())
                .listener(listener)
                .flow(step1)
                .end()
                .build();
    }

    @Bean
    public Step step1(JdbcBatchItemWriter<String[]> writer) {
        return stepBuilderFactory.get("step1")
                .<String[], String[]> chunk(10)
                .reader(reader())
                //.processor(processor())
                .writer(writer)
                .build();
    }
}

Spring Batch 可以实现这样的事情吗?这些属性总是会变化,所以我绝对不能有任何硬编码的值。

如果是,那么我需要做什么才能让它们发挥作用?

【问题讨论】:

    标签: java spring spring-batch


    【解决方案1】:

    您可以通过将这些属性作为作业参数传递(在这种情况下最好作为非识别作业参数传递)和late-bind 在运行时将它们传递给您的阅读器来做到这一点。这是一个例子:

    @Bean
    @StepScope
    public ItemReader<String[]> itemReader(
            @Value("#{jobParameters['fileName']}") String fileName,
            @Value("#{jobParameters['columnNames']}") String columnNames
            ) {
        return new FlatFileItemReaderBuilder<String[]>()
                .name("hacReader")
                //put file here
                .resource(new FileSystemResource(fileName))
                .lineMapper(new DefaultLineMapper<String[]>() {{
                    setLineTokenizer(new DelimitedLineTokenizer() {{
                        //put column names here
                        setNames(columnNames.split(","));
                    }});
                }})
                .build();
    }
    

    通过此设置,阅读器将使用指定为作业参数的fileNamecolumnNames 动态配置:

    JobParameters jobParameters = new JobParametersBuilder()
                .addString("fileName", "/path/to/input/file")
                .addString("columnNames", "column1,column2,column5")
                .toJobParameters();
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2012-10-18
      • 1970-01-01
      • 2023-03-29
      • 2015-04-29
      • 1970-01-01
      • 2019-03-20
      • 2016-03-09
      • 2014-02-25
      • 1970-01-01
      相关资源
      最近更新 更多