spring-batch - 如何设计 spring batch 来避免请求排长队和重启失败的作业

标签 spring-batch

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

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

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

最佳答案

通过使用面向 block 的处理,Reader、Processor 和 Writer 依次执行,直到 Reader 没有可返回的内容。 如果您一次可以读取一个项目,对其进行处理并将其发送回处理持久性的端点,则这种方法很方便。

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

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

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

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

关于spring-batch - 如何设计 spring batch 来避免请求排长队和重启失败的作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27846442/

相关文章:

spring - 使用 Spring Batch 解析多个 csv 文件

java - SpringBatch Step chunk 中的通用方法

java - Spring Batch : How to cast stepContext. getJobExecutionContext() 进入mockito中的自定义Map实现,然后

java - MultiResourceItemReader - 如果标题无效则跳过整个文件

java - 如何用 spring batch 解析 json 文件?

java - 基于哈希的分区

java - Spring Data JPA 不适用于 String Batch

java - Spring Batch如何分块读取?它维护光标吗?

java - 具有 FileReadingMessageSource 的 IntegrationFlows 对同一输入文件触发作业两次

java - 停止后是否可以重新开始工作?