我有一个步骤,我需要从 db 表中读取一些行,并为每一行写入一条记录(例如在顺序文件中,但这应该不重要)。
每行属于一个组,在处理一个组的所有行之后,我需要添加一个“终止记录”,其中包含该组的记录计数等一些信息(我可以在阅读时进行排序以确保同一组的所有行都是邻近的)。
我试图实现 ItemStreamWriter 接口,将最后一组写入属性并在写入不同组的项目之前写入终止记录:
private Group group = null;
public void write(List<? extends Record> data) {
for (Record item : data) {
if(group==null) {
group = item.getGroup();
} else if(!group.equals(item.getGroup())) {
addTeminationRecord(group);
group = item.getGroup();
}
addRegularRecord();
}
}
问题是我不知道什么时候写最后一个终止记录。我在考虑“关闭”方法,但我不知道流是因为主干完成还是在失败后关闭。
我考虑的另一种解决方案是使用读取器加载整个组(ItemReader),并将记录列表作为组的属性。问题是每组的记录数量非常多,并且记录包含很多数据,这会导致不同的问题(内存,如果需要回滚事务会丢失太多工作,ecc。)
有没有不同的方式来获得我需要的东西?
更新:只有在处理组的最后一条记录时,我才需要添加终止记录。据我了解, FlatFileItemWriter 的 footerCallback 总是写页脚,即使在步骤执行被中断的情况下也是如此。我对吗?