我正在从文件夹中读取多个文件。假设文件名像test1.txt,test2.txt,test3.txt。我想将这些文件名传递给writer,并生成输出文件名,如'test1.xml''test2.xml''test3.xml。如何从文件读取器传递文件名到文件写入器弹簧批次
欣赏这方面的任何帮助。
@Autowired
public StepBuilderFactory stepBuilderFactory;
@Autowired
public JobBuilderFactory jobBuilderFactory;
@Value("classpath*:test*.txt")
private Resource[] inputFiles;
@Value("${fluent.ttrade.Location.Outbound}")
private String outPutLocation;
@Bean
public MultiResourceItemWriter<DeliveryOrder> multiResourceBlkdItemWriter() throws Exception {
MultiResourceItemWriter<DeliveryOrder> multiWriter = new MultiResourceItemWriter<DeliveryOrder>();
multiWriter.setDelegate(blkdItemWriter());
String customerOutputPath = outPutLocation + "test1.xml";
System.out.println(">> Output Path: " + customerOutputPath);
multiWriter.setResource(new FileSystemResource(customerOutputPath));
return multiWriter;
}
@Bean
public MultiResourceItemReader<trade> multiResourceBlkdItemReader() {
MultiResourceItemReader<trade> reader = new MultiResourceItemReader<trade>();
reader.setDelegate(blkdItemReader());
reader.setResources(inputFiles);
return reader;
}
@Bean
public FlatFileItemReader<trade> blkdItemReader() {
FlatFileItemReader<trade> reader = new FlatFileItemReader<>();
DefaultLineMapper<trade> customerLineMapper = new DefaultLineMapper<>();
FixedLengthTokenizer tokenizer = new FixedLengthTokenizer();
tokenizer.setNames(new String[] { "recordType"});
tokenizer.setColumns(new Range[] { });
customerLineMapper.setLineTokenizer(tokenizer);
customerLineMapper.setFieldSetMapper(new MYFieldSetMapper());
customerLineMapper.afterPropertiesSet();
reader.setLineMapper(customerLineMapper);
return reader;
}
@SuppressWarnings("deprecation")
@Bean
public CustomStaxEventItemWriter<order> blkdItemWriter() throws Exception {
//some code here
itemWriter.setHeaders(listHeaders);
itemWriter.setMarshaller(marshaller);
itemWriter.setRootTagName("blkdFile");
itemWriter.setFooterCallback(blkdFooterCallBack());
itemWriter.afterPropertiesSet();
return itemWriter;
}
@Bean
public BlkdFooterCallBack blkdFooterCallBack() {
BlkdFooterCallBack callback = new BlkdFooterCallBack();
return callback;
}
@Bean
public BlkdItemProcessor blkdItemProcessor() {
return new BlkdItemProcessor();
}
@Bean
public JobExecutionListener listener() {
return new EtradeResultJobListener();
}
@Bean
public Step step1() throws Exception {
return stepBuilderFactory.get("step1")
.<trade, order> chunk(2000)
.reader(multiResourceBlkdItemReader())
.processor(blkdItemProcessor())
.writer(multiResourceBlkdItemWriter())
.listener(blkdFooterCallBack())
.build();
}
@Bean
public Job job() throws Exception {
return jobBuilderFactory.get("job")
.start(step1())
.listener(listener())
.build();
}
当前使用我的配置我正在写所有的测试文件到一个单一的XML。请建议我配置生成多个文件。
你可以参考https://bigzidane.wordpress.com/2016/09/12/spring-batch-partitionerreaderprocesorwriterhibernateintellij/ 在这个例子中,我们存储的文件名ExecutionContext,所以你可以重用它 –
https://stackoverflow.com/questions/24623254/flatfileitemwriter-should-write-output-file-named-same-as-input-file https://stackoverflow.com/questions/ 24817659/spring-batch-passing-resource-name-from-multiresourceitemreader-flatfileitem –
Luca Basso Ricci,我无法尝试第二个option.we将不会有任何工作parameters.attached配置。您可以请建议如何将文件名传递给multiresorcewriter。 –