如何解决在 SpringBatch
我正在使用 ClassifierCompositeitemprocessor
处理具有多格式行的多个输入文件。但是当使用 StepBuilderFactory
流写入文件时,我无法动态传递 Resource
文件名。文件名应该是各自的输入文件名。任何帮助将不胜感激。
输入文件 1 (data-111111-12323.txt)
1#9999999#00001#2#recordtype1
2#00002#June#Statement#2020#9#recordtype2
3#7777777#recordtype3
输入文件 2 (data-22222-23244.txt)
1#435435#00002#2#recordtype1
2#345435#July#Statement#2021#9#recordtype2
3#645456#recordtype3
预期输出文件 1 (data-111111-12323.txt)
1#9999999#00001#2#recordtype1#mobilenumber1
2#00002#June#Statement#2020#9#recordtype2#mobilenumber2
3#7777777#recordtype3#mobilenumber3
预期输出文件 2 (data-22222-23244.txt)
1#9999999#00001#2#recordtype1#mobilenumber1
2#00002#June#Statement#2020#9#recordtype2#mobilenumber2
3#7777777#recordtype3#mobilenumber3
步骤
public Step partitionStep() throws Exception {
ItemReader reader = context.getBean(FlatFileItemReader.class);
ClassifierCompositeItemWriter writer = context.getBean(ClassifierCompositeItemWriter.class);
return stepBuilderFactory.get("statementProcessingStep.slave").<String,String>chunk(12).reader(reader).processor(processor()).writer(writer)
.stream(recordtype0FlatFileItemWriter())
.stream(recordtype1FlatFileItemWriter())
.build();
}
处理器
@Bean
@StepScope
public itemprocessor processor() {
ClassifierCompositeitemprocessor<? extends recordtype,? extends recordtype> processor = new ClassifierCompositeitemprocessor<>();
SubclassClassifier classifier = new SubclassClassifier();
Map typeMap = new HashMap();
typeMap.put(recordtype0.class,recordtype0Processor);
typeMap.put(recordtype1.class,recordtype1Processor);
classifier.setTypeMap(typeMap);
processor.setClassifier(classifier);
return processor;
}
作家
@Bean
public FlatFileItemWriter<recordtype1> recordtype1FlatFileItemWriter() throws Exception{
FlatFileItemWriter<recordtype1> writer = new FlatFileItemWriter<>();
writer.setResource( new FileSystemResource("record1.txt")); //This filename should be dynamic
writer.setAppendAllowed(true);
writer.setLineAggregator(new DelimitedLineAggregator<recordtype1>() {{
setDelimiter("#");
setFieldExtractor(new BeanWrapperFieldExtractor<recordtype1>() {
{
setNames(new String[] { "recordtype","ID1","ID2","ID3"});
}
});
}});
return writer;
}
解决方法
您可以使用后期绑定将您的项目读取器/写入器设置为步进范围并从作业参数或步骤/作业执行上下文中注入值。例如:
@StepScope
@Bean
public FlatFileItemReader flatFileItemReader(@Value("#{jobParameters['input.file.name']}") String name) {
return new FlatFileItemReaderBuilder<Foo>()
.name("flatFileItemReader")
.resource(new FileSystemResource(name))
.build();
}
您可以在参考文档的 Late Binding of Job and Step Attributes 部分找到更多详细信息。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。