【问题标题】:How to prevent Spring Batch from resubmitting chunk items in the event of a skippable exception thrown by an item writer?如果项目编写器抛出可跳过的异常,如何防止 Spring Batch 重新提交块项目?
【发布时间】:2017-10-14 10:20:18
【问题描述】:

我指的是 Manning 出版商的 Spring Batch 书籍。引用书中的一段话:

当一个项目阅读器抛出一个可跳过的异常时,Spring Batch 只是 在项目阅读器上再次调用 read 方法以获取下一个项目。 事务没有回滚。当物品处理器抛出 一个可跳过的异常,Spring Batch 回滚 当前块并将读取的项目重新提交给项目处理器, 除了在 上一次运行。图 8.3 展示了 Spring Batch 在 item 时做了什么 writer 抛出一个可跳过的异常。因为框架没有 知道哪个项目引发了异常,它会重新处理 在自己的事务中一个一个地块。

我想知道上述过程的官方 Spring Batch 术语是什么,项目编写者抛出一个可跳过的异常并且块被一个接一个地重新提交 ?

我的项目编写者发送电子邮件,我想确保在任何情况下都不会发生这种重新提交和重新处理块项目的过程,因为任何异常(这将重新发送已经发送的块中的电子邮件,这将是一个问题) . 我如何确保不会重新提交项目(或任何名称)?

【问题讨论】:

    标签: spring-batch


    【解决方案1】:

    最好的方法是一开始就不要抛出可跳过的异常。如果这是由于预期的业务/验证规则而明确创建的异常,我建议改为利用仅从处理器返回 null 的“过滤器”模式。或者,您可以使用Classifier 处理器/写入器来处理与有效记录不同的无效记录。

    如果抛出异常是不可避免的,我建议你使用 try/catch 并在 ItemProcessor 中处理它并在那里处理它。

    关于框架在遇到可跳过的异常时会做什么的概述,check out this older answer

    【讨论】:

    • 谢谢院长。 MailSendException 是不可避免的,我已经用 try/catch 处理了这个异常。我也没有ItemProcessor:只有ItemReaderItemWriter。我担心上面提到的其他例外情况。
    • 如果您的工作单元确实是 1,那么我会将您的提交间隔设置为 1。如果您不是真的打算这样做,我也可能会考虑迁移到像 Spring Integration 这样的不同框架做“批量”工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-06
    • 2020-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-08
    • 2016-09-13
    相关资源
    最近更新 更多