Spring批处理编写器:在一组记录之后添加一个终结器记录

时间:2013-07-09 15:33:53

标签: spring-batch

我有一个步骤,我需要从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总是写入页脚,即使步骤执行被中断。 我是对的吗?

1 个答案:

答案 0 :(得分:0)

你是对的,即使写入记录时出错,也会始终调用FlatFileItemWriter的footerCallback。您可以将“group”变量传递给页脚回调(例如,通过ItemStream),并且回调可以引用最新的“group”并写入它是否为null。因此,在开始编写之前,您不必关心/定义最后一组。

替代方案:按照您当前的设置,我在想您是否有可能获得您希望阅读的记录数量。使用该计数,通知您的作者,以便它知道何时写下最后的终止记录。