Read file name when using MultiResourceItemReader in Springbatch

By | April 15, 2016
Share the joy
  •  
  •  
  •  
  •  
  •  
  •  

Springbatch provides MultiResourceItemReader to allow us to read all files in a folder:

<bean id="filenameReader" class=" org.springframework.batch.item.file.MultiResourceItemReader">
    <property name="resources" value="file:SpringBatchReadFilename/tmp/*.csv" />
    <property name="delegate" ref="filenameFlatReader" />
</bean>

However, there maybe some cases that we want. Assume we have below 2 files and we want to output the filename in processor or writer.

20160402.csv
id,value
4,d

20160403.csv
id,value
1,a
2,b
3,c

How do we do that? My friend Yidong Du provides an brilliant solution: write a self-defined FlatFileItemReader and overwrite setResource(), doReader() methods. In each doReader set the filename in entity:

@Data
public class FilenameItemReader extends FlatFileItemReader<FilenameEntity> {

    private Resource myresource;

    @Override
    public void setResource(Resource var1) {
        super.setResource(var1);
        myresource = var1;
    }

    @Override
    protected FilenameEntity doRead() throws Exception {
        FilenameEntity filenameEntity = super.doRead();
        if (filenameEntity == null) {
            return null;
        }
        filenameEntity.setFileName(myresource.getFile().getName());
        return filenameEntity;
    }

}

In writer, it writes the entities with fileName:
FilenameEntity(id=4, value=d, fileName=20160402.csv)
FilenameEntity(id=1, value=a, fileName=20160403.csv)
FilenameEntity(id=2, value=b, fileName=20160403.csv)
FilenameEntity(id=3, value=c, fileName=20160403.csv)

Check my code on github: link