Spring批处理 - 处理后从目录中删除平面文件

时间:2014-04-27 12:41:10

标签: java spring spring-batch

在spring批处理中,我使用MultiResourceItemReader从目录中读取多个文件。然后我使用FlatFileItemReader作为委托处理单个文件。我的用例是在文件完全处理后删除文件(完成READ-WRITE),然后multiResourceitemReader必须选择另一个文件,它必须继续。

我尝试使用FileDeletingTasklet来删除目录中的文件,但是根据Spring文档,execute方法只会被调用一次。如何在文件上删除已处理的文件(READ-WRITE),但是我不希望在目录中完全处理完所有文件后再删除整个目录。

以下是我正在使用的工作:

<batch:job id="getEmpDetails">
    <batch:step id="readAndProcess" next="deleteProcessedFile">
        <batch:tasklet>
            <batch:chunk reader="readEmpDetails" writer="writeEmpDetails" commit-interval="100">
            </batch:chunk>
        </batch:tasklet>
    </batch:step>
    <batch:step id="deleteProcessedFile">
            <batch:tasklet ref="fileDeletingTasklet" />
    </batch:step>
</batch:job>
<bean id="fileDeletingTasklet" class="com.test.FileDeletingTasklet">
      <property name="directoryResource">
          <bean id="directory" class="org.springframework.core.io.FileSystemResource">
             <constructor-arg value="E:/testDir/file1.txt" />
        </bean>
      </property>
</bean>

2 个答案:

答案 0 :(得分:3)

FlatFileItemReader.setResource()方法重写为

public void setResource(Resource resource) {
  this.resource = resource;
  this.delegateReader.setResource(resource);
}

并在完全使用流时管理FlatFileItemReader.read()中的文件删除

public T read() throws Exception {
  T o = this.delegateReader.read();
  if (o == null) {
    // Perform deletion here
    deleteFile(this.resource);
  }
  return o;
}

答案 1 :(得分:2)

我通过在jobcontext中添加进行文件名作为列表来实现它,然后在下一步中执行我的自定义tasklet来删除文件或根据列表移动文件。