2017-08-03 99 views
1

为什么在Jsr 352 ItemWriter接口中有一个checkpointInfo方法。读者和作者如何交流正在提交的内容为什么JSR 352的ItemWriter接口中存在checkpointInfo?任何示例实现?

+0

首先,作者不需要使用** checkpointInfo()**。您可以简单地选择忽略** open()**中的检查点值并返回null(如** AbstractItemWriter **中的impl)。这很常见。 您可能在写入平面文件时使用检查点,比如跟踪字符位置。由于文件写入通常不是事务性的,因此您需要以某种方式对此进行解释。我相信SpringBatch有些样本可能会有人指出。除了缺少样本外,这是否回答你的问题? –

+0

@ScottKurz感谢斯科特!是的,在我的情况下,我确实有一个平面文件作为输出。作为一个后续问题,如果块大小为100,并且如果进程在#550处失败,则在重新启动时,我的阅读器将具有500的检查点。但是在我的作者中,我需要确保它具有550我不再写以前处理的500-550。这将是一个可以使用我的作家检查点的场景。你会同意吗? – user8341239

+0

@ScottKurz谢谢! – user8341239

回答

0

作者不需要使用checkpointInfo()方法。您可以简单地选择忽略open()中的检查点值并返回null(如AbstractItemWriter一样)。这很常见。您不需要任何类型的“游标”或索引来写入数据库,通常情况下,您只需插入/更新读取器/处理器给您的任何内容(基于读取器检查点等)。

写入平面文件时可能会使用检查点。由于文件写入通常不是事务性的,因此您需要以某种方式对此进行解释。

一个简单的方法是在最近的块结束时检查文件中的字节#/偏移量。因此,如果在您将记录501-600写入文件后,块事务回滚,那么在重新启动后,您将重新读取并重新处理记录501-600。即使记录501-600已经存在于文件中,您现在将覆盖它们,因为您在记录500之后的字节位置处开始(重新)。

由于重新启动不应该太频繁,而且只有一个块值得重新处理,这可以为缺乏事务资源提供一种简单可接受的方法。

相关问题