0

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

4

1 回答 1

0

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

替代方案:按照您当前的设置,我正在考虑是否有可能获得您期望读取的记录数。使用该计数,通知您的编写器,以便它知道何时编写最后一个终止记录。

于 2013-07-13T10:01:05.713 回答