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

问题描述:

我是Spring Batch的新手,我开始使用Spring Boot & Spring批处理官员tutorialSpring批处理:将读入文件的名称传递到下一步

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

我第一次尝试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; 
} 

这是所有工作真的很好,但事实证明,如果我这样做,豆中的代码将自动执行,即使它不是在作业步骤定义。这显然是因为依赖注入(Spring boot spring.batch.job.enabled=false not able to recognize

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

我想要做的就是读取一组文本文件,读入其中的数据,将其存储到数据库(这已经完成)然后,在下一步中删除/归档/移动这些文件所以如果出现类似FlatFileParseException的情况,整个作业将停止并且不会删除文件。

+0

请点击这里http://stackoverflow.com/questions/23323535/spring-batch-delete-the-flatfile-from-directory-after-processed –

+0

可悲的是很多的一个,我已经检查,但我甚至无法实现该代码,即使我这样做,tbh我不喜欢在读取方法中删除文件,但宁愿将它作为一个单独的步骤与一个tasklet。 – dK3

+0

如果是这样,在read()中不要删除文件,而是将文件名存储在执行上下文中,将该属性提升到下一步并执行文件删除 –

创建,您可以使用的步骤

之间传递数据通过注释与​​或@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; 
    } 
}