我正在從文件夾中讀取多個文件。假設文件名像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。 –