Spring批处理过程中跳过项目并在DB中记录跳过的项目,然后再次将数据写入DB

时间:2018-10-29 10:26:59

标签: spring-boot spring-batch spring-retry

我是使用Spring Boot进行Spring批处理的新手,并且阅读了几乎所有可能的可用文章,但没有找到如下所示的用例的准确方案/摘要。

  1. 从数据库中读取数据(例如:5个项目)
  2. 处理数据:调用API,如果API调用失败,则 跳过该项目并处理下一个项目。 (对于顺序中的所有5个项目)
  3. 所有跳过的项目都应记录在数据库中
  4. 在处理了所有5个项目失败/成功的项目之后,然后在一定时间间隔后重试失败的项目。

我使用了RetryTemplate,但在那里它会立即重试异常项,因此对我不起作用。

我创建了跳过策略,该策略跳过异常并给了我预期的行为,但是无法以相同的方式启动重试尝试(3)。

有人可以帮忙提供一些例子,并指导我吗……

1 个答案:

答案 0 :(得分:0)

  

在处理完所有5个项目失败/成功的项目之后,然后在一定时间间隔后重试失败的项目

容错功能(跳过和重试)在块内的项目上执行,而不是在整个块上执行。因此,不可能处理所有项目(其中某些项目可能会失败),一旦处理完整个块,请然后,然后重试失败的项目。指定重试策略时,此策略将应用于项目,而不是整个块。

  

我使用了RetryTemplate,但是在那里它立即重试异常项

您可以在重试模板上设置BackoffPolicy,并且每次重试之间都会有一个退避期(而不是立即重试)。但是同样,此政策将应用于重试的项目,而不是整个块。

您可以使用的一种技术(因为输入是数据库表)是“过程指示器模式”的一种变体(显示为in this sample)。想法是使用标志来指示要处理的记录。您的作业应该只读取要处理的记录,将成功的记录标记为已处理(更新标志),将跳过的记录标记为未处理(或者因为默认为false而根本不更新标志)。这样,跳过的记录将成为下一次作业输入的一部分,并且将通过设计重试。

希望这会有所帮助。