【问题标题】:Spring Batch: Pass over names of read-in files to the next stepSpring Batch:将读入文件的名称传递到下一步
【发布时间】:2017-07-12 00:36:08
【问题描述】:

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

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

我首先尝试 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 的东西,整个作业将停止并且不会删除文件。

【问题讨论】:

  • 遗憾的是,这是我检查过的众多代码之一,但我什至无法实现该代码,即使我这样做了,我也不喜欢以读取方法删除文件,而是宁愿这样做一个带有 tasklet 的单独步骤。
  • 如果是这样,在 read() 中不要删除文件,而是将文件名存储在执行上下文中,将此属性提升到下一步并执行文件删除

标签: java spring spring-boot spring-batch batch-processing


【解决方案1】:

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

通过使用@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;
    }
}

【讨论】:

    猜你喜欢
    • 2014-09-09
    • 1970-01-01
    • 2013-01-05
    • 2018-03-18
    • 1970-01-01
    • 2019-09-27
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    相关资源
    最近更新 更多