Spring batch - 项目阅读器知道阅读器处理的最后一条记录

Posted

技术标签:

【中文标题】Spring batch - 项目阅读器知道阅读器处理的最后一条记录【英文标题】:Spring batch - Item reader to know last record processed by reader 【发布时间】:2021-06-23 12:09:32 【问题描述】:

ItemReader 每次作业运行时都会从不断增长的现有表中读取数据。我正在寻找 Spring 批处理中的选项,以便在每次调度作业运行时仅查询新记录。

如果我读取了 50000 条记录,下一个计划应该从 50001 开始。

我的想法是将 ItemReader 读取的最后一条记录的 id (整个读取器输出的最后一个,而不是每个块的最后一个)保存在 DB 中,并在后续作业计划中使用。我将从主表返回按 id 排序的数据。

我如何知道 writer 中的最后一条记录?任何想法。

【问题讨论】:

批处理是关于固定的、有限的数据集。 “不断增长的现有表”不是固定的数据集。您需要让每个作业实例处理一个固定的数据集,例如通过传递一系列 ID 作为作业参数,如“Ken Chan”所建议的。进程指示器模式是解决这个问题的另一种方法(使用布尔列标记已处理的记录,并使读取器在每次运行时只读取未处理的记录)。 【参考方案1】:

我会通过传递在运行批处理作业时需要作为作业参数处理的记录的 ID 范围(即fromIdtoId)来明确说明。那么在ItemReader中,就可以依靠这个ID范围返回数据进行处理了。

并以某种方式将已处理的最新 ID 保存到数据库(例如,在作业完成时使用 JobExecutionListener)。当下一个调度作业触发时,找出下一个没有被处理的ID,然后以这个下一个ID作为参数启动另一个作业实例。

【讨论】:

以上是关于Spring batch - 项目阅读器知道阅读器处理的最后一条记录的主要内容,如果未能解决你的问题,请参考以下文章

Spring Batch:org.springframework.batch.item.ReaderNotOpenException:阅读器必须打开才能读取

Spring批量分页阅读器和异常处理

Spring Batch - 处理大量数据

在 Spring Batch Step、Tasklet 或 Chunks 之间做出决定

Spring Batch Kafka Kafka 到数据库作业

带有 JobParameters 的 Spring Batch SQL 命令