如何设计弹出批处理以避免长队列请求并重启失败的作业

时间:2015-01-08 17:50:53

标签: spring-batch

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

我使用spring-batch来处理批处理工作。到目前为止,我提出的是一项工作(读者,处理器,作家)将完成所有事情。考虑到

,我不确定这是否是正确的设计
  1. 如果某些请求需要很长时间才能获得响应,我不想排队请求。 [尚不确定]
  2. 在收到所有回复之前,我不想阻止保存回复。 [使用commit-internal将有所帮助]
  3. 如果作业由于某种原因崩溃,我该如何重新启动作业[可能使用批处理管理器会有所帮助,但我的其他选择是什么]

2 个答案:

答案 0 :(得分:2)

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

如果您必须立即阅读所有信息,读者将获得包含所有项目的大集合并将其传递给处理器。处理器将处理所有项目并将结果发送给编写器。您不能只向编写器发送一些内容,因此您必须直接从处理器执行持久性操作,这将违背设计。

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

  1. 设计一次可以读取一个项目的阅读器。使用已经开始的块面向处理来读取一个项目,处理它并将其发回以保持持久性。看看其他读者是如何实现的(比如JdbcCursorItemReader)。
  2. 您创建一个读取整个项目集合的tasklet,然后将其发送回处理。您可以在不同的tasklet中解决此问题。
  3. commit-interval 仅在提交了多少项事务后进行控制。所以它不会帮助你,因为所有的处理和持久性都是通过调用rest服务来完成的。

答案 1 :(得分:1)

我已经想出了一个设计,我认为它会正常工作。

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

  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