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

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

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

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

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

【问题讨论】:

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

标签: spring spring-boot spring-batch spring-jdbc


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2017-01-15
    • 1970-01-01
    • 2017-03-23
    • 2013-09-30
    • 1970-01-01
    • 2019-05-04
    • 2019-06-04
    • 2014-02-24
    • 2018-06-14
    相关资源
    最近更新 更多