Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何为Spring批处理配置分配动态属性?_Java_Spring_Spring Batch - Fatal编程技术网

Java 如何为Spring批处理配置分配动态属性?

Java 如何为Spring批处理配置分配动态属性?,java,spring,spring-batch,Java,Spring,Spring Batch,我有一个用例,需要动态地更改SpringBatch配置bean中的资源、列名、列的位置和其他内容。作业将从JobLauncher启动 我构建了以下内容: @Configuration @EnableBatchProcessing public class BatchConfiguration { public JobBuilderFactory jobBuilderFactory; public StepBuilderFactory stepBuilderFactory;

我有一个用例,需要动态地更改SpringBatch配置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是否可以实现类似的功能?这些属性总是不同的,所以我绝对不能有任何硬编码的值


如果是,那么我需要做什么才能使它们工作?

您可以通过将这些属性作为作业参数传递来实现这一点,在本例中,这些属性最好作为非标识作业参数传递,并在运行时将其传递到读卡器中。以下是一个例子:

@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();
}
希望这有帮助

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