首页 文章

Spring Batch:将读入文件的名称传递给下一步

提问于
浏览
1

我是Spring Batch的新手,我开始使用Spring Boot和Spring Batch官方tutorial .

我遇到的问题是,在使用spring批处理读取一些文件后,我想存储这些文件的名称并在下一步中删除它们 .

我首先尝试使用StepExecutionContext传递数据,但显然我希望传递的数据是大的 . 所以当我初始化Reader并在下一步中读取该文件时,我尝试保存我读取的文件的名称 .

@Bean
public MultiResourceItemReader<Widget> widgetMultiReader() {
    MultiResourceItemReader<Widget> reader = new MultiResourceItemReader<Widget>();
    ClassLoader cl = this.getClass().getClassLoader();
    ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(cl);
    try {
        System.out.println("file:" + dataFileLocation + "Widget*.dat");
        Resource[] resources = resolver.getResources("file:" + dataFileLocation + "Widget*.dat");
        System.out.println("FOUND " + resources.length + " Widget.dat files");
        StringBuilder sb = new StringBuilder();
        for (int i=0; i<resources.length; i++) {
            System.out.println(resources[i].getFilename());
            sb.append(resources[i].getFilename());
            if(i < resources.length-1){
                sb.append("\n");
            }
        }
        reader.setResources(resources);
        reader.setDelegate(widgetReader());

        File tempFolder = new File(dataFileLocation + Constants.TEMP_FOLDER_NAME);
        tempFolder.mkdir();
        File tempFile = new File(tempFolder.getAbsolutePath(), "read_in_files.tmp");
        tempFile.createNewFile();
        FileWriter fileWriter = new FileWriter(tempFile, false);
        fileWriter.write(sb.toString());
        fileWriter.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return reader;
}

这一切都运行得很好,但如果我这样做,bean内的代码将自动执行,即使它没有在作业步骤中定义 . 这显然是因为依赖注入(Spring boot spring.batch.job.enabled=false not able to recognize

所以我必须再改变一下我的方法,你能帮助我吗?

我想做的就是读取一组文本文件,读入其中的数据,将其存储到数据库中(这已经完成)然后,在下一步中删除/存档/移动这些文件,如果有的话与FlatFileParseException一样,整个作业将停止并且不会删除文件 .

1 回答

  • 0

    创建可用于在步骤之间传递数据的服务

    通过使用 @JobScope@StepScope 注释服务,它将仅在该步骤或作业期间生效 .

    import org.springframework.batch.core.configuration.annotation.JobScope;
    import org.springframework.stereotype.Service;
    
    import java.io.File;
    import java.util.List;
    
    @Service
    @JobScope
    public class FilesService {
    
        private List<File> files;
    
        public List<File> getFiles() {
            return files;
        }
    
        public void setFiles(List<File> files) {
            this.files = files;
        }
    }
    

相关问题