Spring batch Spring批处理页脚验证
我使用SpringBatch处理一个包含页眉、细节和页脚记录的文件。 页脚包含文件中记录的总数。 如果详细记录计数与页脚中的计数不匹配,则不应处理该文件 我正在使用一个自定义行标记器来处理页眉、细节和页脚记录。当遇到页脚记录时,如果计数与详细记录计数匹配,我将抛出一个异常 但我面临的问题是,如果区块大小设置为10这样的小数字,并且文件有20条记录,则前10条细节记录将被持久化到数据库中,即使页脚计数与记录总数匹配 在调用编写器之前,是否有方法使用文件中的记录数验证页脚计数Spring batch Spring批处理页脚验证,spring-batch,Spring Batch,我使用SpringBatch处理一个包含页眉、细节和页脚记录的文件。 页脚包含文件中记录的总数。 如果详细记录计数与页脚中的计数不匹配,则不应处理该文件 我正在使用一个自定义行标记器来处理页眉、细节和页脚记录。当遇到页脚记录时,如果计数与详细记录计数匹配,我将抛出一个异常 但我面临的问题是,如果区块大小设置为10这样的小数字,并且文件有20条记录,则前10条细节记录将被持久化到数据库中,即使页脚计数与记录总数匹配 在调用编写器之前,是否有方法使用文件中的记录数验证页脚计数 谢谢。您需要的是一个定
谢谢。您需要的是一个定义了页脚回调处理程序的阅读器。我曾经遇到过类似的问题,帮了我很多! 请参阅Atefeh Zareh的最后一篇文章。他还包括了xml配置
关于前十个被持久化,您可以在主处理步骤之前进行另一个验证步骤,该步骤只检查头和尾计数。不要在编写器中编写任何持久性逻辑。如果计数失败,停止作业,使其不进入处理步骤。通过编写我们自己的项目读取器以及项目类来处理页眉、页脚、数据记录,并查找页眉、页脚、数据记录的计数 ItemReader类
public class AggregateItemReader<T> implements ItemStreamReader<ResultHolder> {
private ItemStreamReader<AggregateItem<T>> itemReader;
@Override
public ResultHolder read() throws Exception {
ResultHolder holder = new ResultHolder();
while (process(itemReader.read(), holder)) {
continue;
}
if (!holder.isExhausted()) {
return holder;
}
else {
return null;
}
}
private boolean process(AggregateItem<T> value, ResultHolder holder) {
// finish processing if we hit the end of file
if (value == null) {
LOG.debug("Exhausted ItemReader");
holder.setExhausted(true);
return false;
}
// start a new collection
if (value.isHeader()) {
LOG.debug("Header Record detected");
holder.addHeaderRecordCount();
return true;
}
// mark we are finished with current collection
if (value.isFooter()) {
LOG.debug("Tailer Record detected");
holder.addTailerRecordCount();
holder.setFiledRecordCount(value.getFieldSet().readInt(3));
System.out.println("###########################################"+holder.getDataRecordCount()+"############################################");
return false;
}
// add a simple record to the current collection
holder.addDataRecordCount();
return true;
}
}
如果有任何疑问,请随时邮寄至sk。baji6@gmail.com如果文件很小,您可以设置一个高提交间隔来强制执行单个块处理,但这是一种肮脏的方式吗?还有比预验证更好的方式吗?我不想将块大小设置得太高。你知道最后一条记录有多少字节长吗?@jyn有很多选择。我会编写一个tasklet,只读取文件并进行验证,如果验证通过,我会进入下一步,即您现在的步骤并进行正常插入。如果找到的记录数与页脚数匹配,但某些记录的写入失败,会发生什么情况?文件仍然正确吗?谢谢宙斯,但这不是我想要的,我已经能够解析页脚并保存信息了。我想在处理文件之前对其进行验证,因此定义了一个tasklet来检查页脚计数匹配情况,并随后在tasklet成功时调用加载步骤。
public class AggregateItem<T> {
@SuppressWarnings("unchecked")
public static <T> AggregateItem<T> getData(FieldSet fs) {
return new AggregateItem(fs, false, false, true);
}
@SuppressWarnings("unchecked")
public static <T> AggregateItem<T> getFooter(FieldSet fs) {
return new AggregateItem(fs, false, true, false);
}
@SuppressWarnings("unchecked")
public static <T> AggregateItem<T> getHeader(FieldSet fs) {
return new AggregateItem(fs, true, false, false);
}
private boolean data = false;
private FieldSet fieldSet;
private boolean footer = false;
private boolean header = false;
private T item;
public AggregateItem(FieldSet fs, boolean header, boolean footer, boolean data) {
this(null);
this.header = header;
this.footer = footer;
this.data = data;
this.fieldSet = fs;
}
public AggregateItem(T item) {
super();
this.item = item;
}
public FieldSet getFieldSet() {
return fieldSet;
}
public T getItem() {
return item;
}
public boolean isData() {
return data;
}
public boolean isFooter() {
return footer;
}
public boolean isHeader() {
return header;
}
public class ResultHolder implements {
private Integer headerRecordCount = 0;
private Integer dataRecordCount = 0;
private Integer tailerRecordCount = 0;
private Integer filedRecordCount;//this is to save record count given in source File
private boolean exhausted = false;//setters & getters