我正在从该文件夹中读取多个文件。假设文件名类似于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。请建议我生成多个文件的配置。
答案 0 :(得分:0)
Spring Batch有一个名为ResourceAware
的接口。在其中,当使用MultiResourceItemReader
时,如果返回的项实现了该接口,我们将注入该项来自的资源。这使您可以获得项目来自哪个文件所需的所有信息。您可以在javadoc中阅读有关此界面的更多信息:https://docs.spring.io/spring-batch/trunk/apidocs/org/springframework/batch/item/ResourceAware.html