【发布时间】:2018-03-18 09:35:33
【问题描述】:
我正在从文件夹中读取多个文件。假设文件名类似于 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。请建议我生成多个文件的配置。
【问题讨论】:
-
您可以参考bigzidane.wordpress.com/2016/09/12/… 在该示例中,我们将文件名存储到 ExecutionContext 以便您可以重复使用它
-
Luca Basso Ricci,我无法尝试第二个选项。我们将没有任何作业参数。附上配置。请您建议如何将文件名传递给 multiresorcewriter。
标签: xml spring spring-boot spring-batch