Spring Batch FlatFileItemReader在所有读取的项目/行中填充字段值

时间:2016-03-30 08:10:44

标签: java spring spring-batch batch-processing

我正在使用spring batch FlatFileItemReader读取平面文件。

我有一个requestId字段,我需要为从平面文件读取的所有记录填充唯一值。  例如:当我读取file1时。我想为在requestId字段创建的所有Item对象设置requestId为1。对于file2,我需要将requestId设置为2。

我的requestId由一个单独的类唯一生成。

如何使用弹簧批来实现这一目标?

1 个答案:

答案 0 :(得分:0)

有一些可能的解决方案

使用ResourceAware项目

public class MyItem implements ResourceAware {

    private Resource resource;

    public String getId() {
        return createIdFromResource(resource);
    }

    private String createIdFromResource(final Resource resource) {
        // create your ID here
        return resource.getFilename();
    }

    @Override
    public void setResource(final Resource resource) {
        this.resource = resource;
    }
}

使用Listener(这里有接口​​,也可以使用更简洁的注释)

public class TestListener implements StepExecutionListener, ItemReadListener<String> {
    private StepExecution stepExecution;
    private static final String CURRENT_ID = "currentId";

    @Override
    public void beforeStep(final StepExecution stepExecution) {
        this.stepExecution = stepExecution;
    }

    @Override
    public ExitStatus afterStep(final StepExecution stepExecution) {
        return null;
    }

    @Override
    public void beforeRead() {
    }

    @Override
    public void afterRead(final String item) {
        String currentId = null;
        if (stepExecution.getExecutionContext().containsKey(CURRENT_ID)) {
            currentId = stepExecution.getExecutionContext().getString(CURRENT_ID);
        } else {
            String fileName = stepExecution.getExecutionContext().getString("fileName");
            // ... create ID from FileName
            currentId = fileName + "foo";
            stepExecution.getExecutionContext().put(CURRENT_ID, currentId);
        }
    }

    @Override
    public void onReadError(final Exception ex) {
    }
}

在上面的例子中,当前的fileName在stepExecutionContext中是可用的,你可能需要从jobParameters中提取它并提取文件名

String paramValue = stepExecution.getJobExecution().getJobParameters().getString("paramName");
// extract fileName from paramValue