Spring 批处理 FlatFileItemReader 在所有 items/lines 读取中填充字段值

Spring Batch FlatFileItemReader populating field value across all items/lines read

我正在使用 spring 批处理 FlatFileItemReader 读取平面文件。

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

我的 requestId 是由单独的 class 唯一生成的。

如何使用 spring 批处理实现此目的?

有一些可能的解决方案

使用 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) {
    }
}

在上面的示例中,当前文件名在 stepExecutionContext 中可用,您可能必须从 jobParameters 中提取它并提取文件名

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