[英]accessing resources in next steps spring batch
您好,我的春季批处理应用程序中包含以下Tasklet:
public class FileMovingTasklet implements Tasklet, InitializingBean {
@Value("${positionFile.source-path}")
private String sourcePath;
@Value("${positionFile.local-path}")
private String localDirectory;
@Value("${positionFile.patternName}")
private String fileNamePattern;
@Value("${positionFile.suffix}")
private String suffix;
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
//***code***
List<PathResource> resources = FileManager.getInputFileList(sourcePath, fileNamePattern, suffix, fileDate);
if (!CollectionUtils.isEmpty(resources)) {
copyFiles(resources, localDirectory);
log.info("Copied files to local directory...");
}
} catch (IOException e) {
log.error("Position File not found with sourcePatch={}, fileName={}, suffix={}, filedate={}", sourcePath, fileNamePattern, suffix, fileDate);
throw new TaskletException("Could not move file from source to local " + e);
}
return RepeatStatus.FINISHED;
}
private void copyFiles(List<PathResource> resources, String localDirectory) {
for (Resource resource : resources) {
File source;
File target;
try {
source = resource.getFile();
target = new File(localDirectory + File.separator + source.getName());
try {
FileCopyUtils.copy(source, target);
} catch (IOException e) {
}
} catch (IOException e) {
}
}
}
}
我正在将一些文件从源移动到本地目标。 我要在以后的步骤中读取文件并进行处理和写入的位置是本地目标。
我已将我的Job
配置如下:
@Configuration
public class BatchConfiguration {
@Autowired
private JobBuilderFactory jobBuilderFactory;
@Autowired
private StepBuilderFactory stepBuilderFactory;
@Autowired
private FileMovingTasklet fileMovingTasklet;
@Value("${positionFile.local-path}")
private Resource[] resources;
@Autowired
private PriceDao scpDao;
@Autowired
public PositionRowReader positionRowReader;
@Bean
public MultiResourceItemReader<Pos> multiResourceItemReader() {
MultiResourceItemReader<Pos> resourceItemReader = new MultiResourceItemReader<>();
resourceItemReader.setResources(resources);
resourceItemReader.setDelegate(posRowReader());
return resourceItemReader;
}
@Bean
public FlatFileItemReader<Pos> posRowReader() {
return positionRowReader.getReader();
}
@Bean
public ItemProcessor<Pos, Price> posRowProcessor() {
return new PosRowItemProcessor();
}
@Bean
public JobExecutionListener listener() {
return new JobCompletionNotificationListener(scpDao);
}
@Bean
public Job import() {
return jobBuilderFactory.get("import")
.incrementer(new RunIdIncrementer())
.listener(listener())
.start(getPositionFileStep())
.next(step1())
.build();
}
@Bean
public Step getPositionFileStep() {
return stepBuilderFactory.get("getPositionFileStep")
.tasklet(fileMovingTasklet)
.build();
}
@Bean
public Step step1() {
return stepBuilderFactory.get("step1")
.<Pos, Price>chunk(50)
.reader(multiResourceItemReader())
.processor(posRowProcessor())
.writer(new PriceWriter(scpDao))
.build();
}
}
我在执行step1时无法初始化读取器:
org.springframework.batch.item.ItemStreamException: Failed to initialize the reader
我的本地路径属性如下:
positionFile.local-path=C:\\Dev\\workspace\\batch\\src\\main\\resources\\localPath
positionFile.patterName=PositionFile*
我的问题是在从源文件夹复制完文件后,如何在步骤1中访问可以是多个文件的资源(文件)。
即使文件存在,我的资源大小也为0:
@Value("${positionFile.local-path}")
private String filePath;
@Value("${positionFile.patternName}")
private String filePattern;
@Bean
@StepScope
public MultiResourceItemReader<PosRow> multiResourceItemReader() {
MultiResourceItemReader<PosRow> resourceItemReader = new MultiResourceItemReader<>();
Resource[] resources = new Resource[0];
try {
ClassLoader cl = this.getClass().getClassLoader();
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(cl);
resources = resolver.getResources("file:" + filePath + File.separator + filePattern + "*");
} catch (IOException e) {
log.error("Problem with getting resource files");
}
resourceItemReader.setResources(resources);
resourceItemReader.setDelegate(posRowReader());
return resourceItemReader;
}
您需要使用@StepScope使您的MultiResourceItemReader
和FlatFileItemReader
变得懒惰
@Bean
@StepScope
public MultiResourceItemReader<Pos> multiResourceItemReader() {
MultiResourceItemReader<Pos> resourceItemReader = new MultiResourceItemReader<>();
resourceItemReader.setResources(resources);
resourceItemReader.setDelegate(posRowReader());
return resourceItemReader;
}
@Bean
@StepScope
public FlatFileItemReader<Pos> posRowReader() {
return positionRowReader.getReader();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.