问题描述
我正在使用 MultiResourceItemReader 来读取设置到 Resource[] 的多个资源,并且通过使用 Fixed Length Tokenizer 我能够将数据设置到 POJO 类。 在 Item Processor 中,我能够获取由 Item Reader 创建的对象,并能够从对象中获取数据。
我面临的挑战是获取已创建或处理并传递给项目处理器的特定对象的文件名。
感谢您的帮助,谢谢
*这里是批量配置*
@Configuration
@EnableBatchProcession
public class BatchConfig {
@Value("")
private Resource[] resource;
/* Job */
public Job job(){
return jobBuilderFactory.get("job").listerner(listener()).incrementer(new
RunIdIncrementer())
.start(step()).build();
}
/* Step */
public Step step(){
return stepBuilderFactory.get("step")<mypojo,mypojo>chunk(10)
.reader(multiREsourceItemReader()).processor(processor()).writer(writer()).build();
}
/* Multi Resource Item Reader */
@Bean
@StepScope
public MultiResourceItemReader<mypojo> multiResourceItemReader() {
MultiResourceItemReader<mypojo> multireader = new MultiResourceItemReader<mypojo>();
multireader.setResource(resources);
multireader.setDelegate(reader());
return mutlireader;
}
/* Flat FIle Item Reader */
@Bean
public FlatFileItemReader<mypojo> reader() {
FlatFileItmeReader<mypojo> reader = new FlatFileItemReader<mypojo>();
reader.setLineMapper(new DefaultLineMapper() {
{
setLinetokenizer(new FixedLengthTokenizer(){ {
setName(new String[]{"my pojo class attributes ..."});
setColumns( new Range { new Range[1,3] .....});
setStrickt(false);
}
});
setFieldSetMapper(new BeanWrapperFieldsSetMapper<mypojo>(){
{
settargettype(AckResponse.class):
}
}); }});
return reader;
}
@Bean
public Customitemprocessor processor(){
return new ResponseFileProcessor();
}
@Bean
public CustomFileWriter<mypojo> writer(){
return new CustomFileWriter<mypojo>();
}
}
/ 这是项目处理器/
public class CustomProcessor implements itemprocessor<mypojo,mypojo>{
public mypojo process(mypojo item) thows Exception {
return item;
}
解决方法
我已经通过在 Spring Batch 中使用 ResourceAware 接口找到了解决方案。 Mypojo 需要实现 ResourceAware 并重写 setResource 方法,我们可以在那里获取 Resource 详细信息。
关于 ResourceAware :https://docs.spring.io/spring-batch/docs/current/api/org/springframework/batch/item/ResourceAware.html