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
我正在使用 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