Java Spring批处理:将读入文件的名称传递到下一步

Java Spring批处理:将读入文件的名称传递到下一步,java,spring,spring-boot,spring-batch,batch-processing,Java,Spring,Spring Boot,Spring Batch,Batch Processing,我是SpringBatch的新手,我开始使用SpringBoot和SpringBatch官方软件 我的问题是,在使用SpringBatch读入一些文件后,我想存储这些文件的名称,并在下一步中删除它们 @Bean public MultiResourceItemReader<Widget> widgetMultiReader() { MultiResourceItemReader<Widget> reader = new MultiResourceItemReade

我是SpringBatch的新手,我开始使用SpringBoot和SpringBatch官方软件

我的问题是,在使用SpringBatch读入一些文件后,我想存储这些文件的名称,并在下一步中删除它们

@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;
}
我第一次尝试StepExecutionContext传递数据,但显然我希望传递的数据太大了。因此,我尝试保存初始化读卡器时读取的文件名,并在下一步读取该文件

@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
公共MultiResourceItemReader widgetMultiReader(){
MultiResourceItemReader=新的MultiResourceItemReader();
ClassLoader cl=this.getClass().getClassLoader();
ResourcePatternResolver解析器=新路径匹配ResourcePatternResolver(cl);
试一试{
System.out.println(“文件:“+dataFileLocation+”小部件*.dat”);
Resource[]resources=resolver.getResources(“文件:“+dataFileLocation+”小部件*.dat”);
System.out.println(“找到”+resources.length+“Widget.dat文件”);
StringBuilder sb=新的StringBuilder();

对于(int i=0;i创建一个可用于在步骤之间传递数据的服务

通过使用
@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;
    }
}
import org.springframework.batch.core.configuration.annotation.JobScope;
导入org.springframework.stereotype.Service;
导入java.io.File;
导入java.util.List;
@服务
@工作范围
公共类文件服务{
私人清单文件;
公共列表getFiles(){
归还文件;
}
公共无效设置文件(列出文件){
this.files=文件;
}
}

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

通过使用
@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;
    }
}
import org.springframework.batch.core.configuration.annotation.JobScope;
导入org.springframework.stereotype.Service;
导入java.io.File;
导入java.util.List;
@服务
@工作范围
公共类文件服务{
私人清单文件;
公共列表getFiles(){
归还文件;
}
公共无效设置文件(列出文件){
this.files=文件;
}
}

请检查这里,很遗憾,这是我检查过的许多代码之一,但我甚至无法实现这些代码,即使我实现了,我也不喜欢用read方法删除文件,而是宁愿用tasklet将其作为单独的步骤。如果是这样,在read()中,不要删除文件,而是存储文件名在执行上下文中,将此属性升级到下一步并执行文件删除请检查此处。很遗憾,这是我检查过的许多代码之一,但我甚至无法实现该代码,即使我实现了,tbh我不喜欢在read方法中删除文件,而是宁愿使用tasklet将其作为单独的步骤来执行。如果是,在read()中不删除文件,但将文件名存储在执行上下文中,将此属性升级到下一步并执行文件删除