我正在编写一个将生成报告的项目。它将通过进行休息调用从数据库中读取所有请求,根据请求的类型,它将对端点进行休息调用,在获得响应后,它将把响应保存在一个对象中,并通过以下方式将其保存回数据库调用端点。
我正在使用 spring-batch 来处理批处理工作。到目前为止,我想出的是一个单一的工作(阅读器、处理器、写入器)来完成所有的事情。考虑到
,我不确定这是否是正确的设计- 如果某些请求需要很长时间才能得到响应,我不想让请求排队。 [还不确定]
- 我不想在收到所有回复之前一直保存回复。 [使用 commit-internal 会有帮助]
- 如果作业由于某种原因崩溃,我该如何重新启 Action 业[也许使用 batch-admin 会有所帮助,但我还有哪些其他选择]
最佳答案
通过使用面向 block 的处理,Reader、Processor 和 Writer 依次执行,直到 Reader 没有可返回的内容。 如果您一次可以读取一个项目,对其进行处理并将其发送回处理持久性的端点,则这种方法很方便。
如果您必须一次阅读所有信息,读者将获得一个包含所有项目的大集合并将其传递给处理器。处理器将处理所有项目并将结果发送给编写器。您不能只向编写器发送一些数据,因此您必须直接从处理器进行持久化,这有悖于设计。
因此,据我了解,您有两个选择:
- 设计一个可以一次阅读一个项目的阅读器。使用您已经开始读取一个项目的面向 block 的处理,对其进行处理并将其发回以进行持久化。查看其他读取器的实现方式(如 JdbcCursorItemReader)。
- 您创建一个 tasklet,它读取整个项目集合并对其进行处理并将它们发回进行处理。您可以在不同的 tasklet 中打破它。
commit-interval 仅在提交多少项目事务后进行控制。所以它不会帮助你,因为所有的处理和持久化都是通过调用休息服务来完成的。
关于spring-batch - 如何设计 spring batch 来避免请求排长队和重启失败的作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27846442/