【问题标题】:Spring Batch Process Indicator PatternSpring Batch Process Indicator Pattern
【发布时间】:2013-05-12 03:47:49
【问题描述】:

在 Spring Batch 作业中,我将项目写入目标文件(使用 FlatFileItemWriter)并将输入记录“进程指示器”字段更新为“已处理”/“失败”(使用 JdbcBatchItemWriter)。在“物品交易”中实现这一点的最佳方式是什么?

  1. 使用 CompositeItemWriter(将 FlatFileItemWriter 委托给 写入文件和 JdbcBatchItemWriter 以更新“进程 指标”
  2. 使用 ItemWriteListener 方法“afterWrite”和“onWriteError”更新“进程指示器”

【问题讨论】:

    标签: spring spring-batch


    【解决方案1】:

    推荐的方法是使用 ChunkListener#afterChunk 来更新这样的标志。这允许它与您提出的其他两个选项中涉及的任何重试等逻辑分开。

    【讨论】:

    • 但是如何识别ChunkListener 中的已处理项目? afterChunk 方法是无参数的,因此不会注入像 ItemWriteListener 这样的项目。
    • 虽然是这样,但通常您会使用 ChunkListener#beforeChunk() 来标记要处理的项目。然后 ChunkListener#afterChunk() 在块完成后将它们标记为已处理。
    • 对不起,我不明白:ChunkListener#beforeChunk() 也是无参数的。如何从 ChunkListener 中识别要处理的项目?块可以有多个项目,但它们不会被注入到侦听器中。
    • ChunkListener 负责识别下一个要处理的项目块。例如,您的提交间隔为 10,而读者的查询是: select * from foo order by id where pf = 'In Process';您的 ChunkListener#beforeChunk() 将更新返回的行: select * from foo order by id where process_flag is null limit 10;一旦您更新了那里的行,您的阅读器/处理器/编写器将处理由侦听器标记的行。提交块后,您将更新返回的行: select * from foo where pf = 'In Process';
    猜你喜欢
    • 2016-07-13
    • 1970-01-01
    • 2012-11-28
    • 1970-01-01
    • 2019-06-09
    • 2018-10-26
    • 1970-01-01
    • 1970-01-01
    • 2018-07-10
    相关资源
    最近更新 更多