如何设计spring批处理以避免请求排长队和重启失败的作业

How to design spring batch to avoid long queue of request and restart failed job

我正在编写一个将生成报告的项目。它将通过进行 rest 调用从数据库中读取所有请求,根据请求的类型,它将对端点进行 rest 调用,在获得响应后,它将响应保存在一个对象中,并通过以下方式将其保存回数据库调用端点。

我正在使用 spring-batch 来处理批处理工作。到目前为止,我想出的是一个单一的工作(阅读器、处理器、写入器)来完成所有的事情。考虑到

,我不确定这是否是正确的设计
  1. 如果某些请求需要很长时间才能得到响应,我不想让请求排队。 [还不确定]
  2. 我不想等到收到所有回复后才保存回复。 [使用 commit-internal 会有帮助]
  3. 如果作业由于某种原因崩溃,我该如何重新启动作业[也许使用 batch-admin 会有所帮助,但我还有哪些其他选择]

我已经想出了一个设计,我认为它会很好用。

关于我提出的问题,以下是答案:

  1. 使用异步处理器将有助于避免任何队列。 http://docs.spring.io/spring-batch/trunk/reference/html/springBatchIntegration.html#asynchronous-processors

  2. 使用 commit-internal 将解决它

  3. 这个帖子有答案 - Spring batch :Restart a job and then start next job automatically

通过使用面向块的处理 Reader,Processor 和 Writer 会按顺序执行,直到 Reader 与 return 无关。 如果您一次可以读取一个项目,处理它并将其发送回处理持久性的端点,这种方法很方便。

如果您必须一次读取所有信息,reader 将获得包含所有项目的大集合并将其传递给处理器。处理器将处理所有项目并将结果发送给编写器。您不能只向编写器发送一些,因此您必须直接从处理器进行持久化,这有悖于设计。

因此,据我了解,您有两个选择:

  1. 设计一个 reader 可以一次读取一个项目。使用您已经开始读取一个项目的面向块的处理,对其进行处理并将其发回以进行持久化。看看其他 reader 是如何实现的(比如 JdbcCursorItemReader)。
  2. 您创建一个 tasklet,它读取整个项目集合并对其进行处理并将它们发回进行处理。您可以在不同的 tasklet 中打破它。

commit-interval 只控制提交多少项目事务。所以它不会帮助你,因为所有的处理和持久化都是通过调用休息服务来完成的。