2023年6月21日发(作者:)

Spring-batch传递参数,ItemReader,ItemWriter,ItemPr。。。为了能在ItemReader, ItemWriter, ItemProcessor中读取JobParameters中的参数,有两个⽅法:1. 使⽤ @BeforeStep,如下⽰例public class PersonItemProcessor implements ItemProcessor { JobParameters jobParameters; @BeforeStep public void beforeStep(final StepExecution stepExecution) { jobParameters = Parameters(); ("jobParameters: {}", jobParameters); }2. 把相应的Bean定义成@StepScope,再⽤@Value直接注⼊.@Configuration@EnableBatchProcessingpublic class BatchConfiguration { @Autowired public JobBuilderFactory jobBuilderFactory; @Autowired public StepBuilderFactory stepBuilderFactory; @Bean @StepScope public FlatFileItemReader reader() { return new FlatFileItemReaderBuilder() .name("personItemReader") .resource(new ClassPathResource("")) .delimited() .names(new String[]{"firstName", "lastName"}) .fieldSetMapper(new BeanWrapperFieldSetMapper() {{ setTargetType(); }}) .build(); } @Bean @StepScope public PersonItemProcessor processor() { return new PersonItemProcessor(); } @Bean @StepScope public JdbcBatchItemWriter writer(DataSource dataSource) { return new JdbcBatchItemWriterBuilder() .itemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>()) .sql("...") .dataSource(dataSource) .build(); } @Bean("importUserJob") public Job importUserJob(JobCompletionNotificationListener listener, Step step1) { return ("importUserJob") .incrementer(new RunIdIncrementer()) .listener(listener) .flow(step1) .end() .build(); } @Bean //这个不要定义StepScope public Step step1(JdbcBatchItemWriter writer) {重点注意的是,要把ItemReader, ItemWriter, ItemProcessor声明成StepScope,⽽Job和Step本⾝不能申明成StepScope然后在ItemReader, ItemWriter, ItemProcessor中可以直接注⼊参数了:public class PersonItemProcessor implements ItemProcessor { @Value("#{jobParameters['dataUnitId']}") private Long dataUnitId;

2023年6月21日发(作者:)

Spring-batch传递参数,ItemReader,ItemWriter,ItemPr。。。为了能在ItemReader, ItemWriter, ItemProcessor中读取JobParameters中的参数,有两个⽅法:1. 使⽤ @BeforeStep,如下⽰例public class PersonItemProcessor implements ItemProcessor { JobParameters jobParameters; @BeforeStep public void beforeStep(final StepExecution stepExecution) { jobParameters = Parameters(); ("jobParameters: {}", jobParameters); }2. 把相应的Bean定义成@StepScope,再⽤@Value直接注⼊.@Configuration@EnableBatchProcessingpublic class BatchConfiguration { @Autowired public JobBuilderFactory jobBuilderFactory; @Autowired public StepBuilderFactory stepBuilderFactory; @Bean @StepScope public FlatFileItemReader reader() { return new FlatFileItemReaderBuilder() .name("personItemReader") .resource(new ClassPathResource("")) .delimited() .names(new String[]{"firstName", "lastName"}) .fieldSetMapper(new BeanWrapperFieldSetMapper() {{ setTargetType(); }}) .build(); } @Bean @StepScope public PersonItemProcessor processor() { return new PersonItemProcessor(); } @Bean @StepScope public JdbcBatchItemWriter writer(DataSource dataSource) { return new JdbcBatchItemWriterBuilder() .itemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>()) .sql("...") .dataSource(dataSource) .build(); } @Bean("importUserJob") public Job importUserJob(JobCompletionNotificationListener listener, Step step1) { return ("importUserJob") .incrementer(new RunIdIncrementer()) .listener(listener) .flow(step1) .end() .build(); } @Bean //这个不要定义StepScope public Step step1(JdbcBatchItemWriter writer) {重点注意的是,要把ItemReader, ItemWriter, ItemProcessor声明成StepScope,⽽Job和Step本⾝不能申明成StepScope然后在ItemReader, ItemWriter, ItemProcessor中可以直接注⼊参数了:public class PersonItemProcessor implements ItemProcessor { @Value("#{jobParameters['dataUnitId']}") private Long dataUnitId;