在 Spring Batch 中使用 StepScope 注释访问 ItemReader 中的参数时,ItemWriter 不生成输出

问题描述 投票:0回答:0

我正在使用 Spring Boot 和 Spring Batch 应用程序来测试使用以下代码将参数传递给

ItemReader
,但是当我使用
contact-out.dat
时,
StepScope
文件(即输出文件)的内容为空注解。没有错误,只是没有产生任何结果:

@Bean
@StepScope
public ItemReader<Contact> reader(@Value("#{jobParameters['fileName']}") String fileName) {             
    
    BeanIOFlatFileItemReader<Contact> reader = new BeanIOFlatFileItemReader<>();
    try {           
        reader.setUseSpringExceptions(true);
        reader.setResource(new FileSystemResource(fileName));
        reader.setStreamName(inputContactStreamName);
        reader.setStreamMapping(new ClassPathResource(beanIoConfigurationXmlPath));
        reader.setStreamFactory(StreamFactory.newInstance());
        reader.getLineNumber();
        reader.afterPropertiesSet();
    } catch (Exception e) {
        log.error("ERROR: An issue occurred in the BeanIO Item Reader:: {} {}", e.getMessage(), e.getStackTrace());
    }
    
    return reader;      
    
}    

@Bean
public FlatFileItemWriter<Contact> writer() {
    
    FlatFileItemWriter<Contact> writer = new FlatFileItemWriter<>();
    writer.setResource(new FileSystemResource(fileOutputContact));
    writer.setLineAggregator(new DelimitedLineAggregator<Contact>() {
        {
            setDelimiter(",");
            setFieldExtractor(new BeanWrapperFieldExtractor<Contact>() {
                {
                    setNames(new String[] { "firstName", "lastName", "street", "city", "state", "zip" });
                }                   
            });
        }
    });
    
    return writer;
}
    
@Bean("InputJob")
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public Job importUserJob(Step step) {
    return jobBuilderFactory.get("importUserJob")
      .incrementer(new RunIdIncrementer())          
      .flow(step)
      .end()
      .build();
}

@Bean
public Step step(ItemReader<Contact> reader) {      
    return stepBuilderFactory.get("step")
      .<Contact, Contact> chunk(10)
      .reader(reader(null))          
      .processor(contactItemProcessor)
      .writer(writer())          
      .build();
}

现在,如果我删除

StepScope
注释并进行以下更改,则
contact-out.dat
文件具有预期内容:

@Bean
//@StepScope
public ItemReader<Contact> reader(/*@Value("#{jobParameters['fileName']}") String fileName*/) {...}


@Bean
public Step step(ItemReader<Contact> reader) {      
    return stepBuilderFactory.get("step")
      .<Contact, Contact> chunk(10)
      .reader(reader(/*null*/))          
      .processor(contactItemProcessor)
      .writer(writer())          
      .build();
}

使用输出文件始终为空的

StepScope
注释时我在这里做错了什么?

java spring-boot spring-batch
© www.soinside.com 2019 - 2024. All rights reserved.