Spring batch 重试失败的写入操作,但不延迟Spring批处理应用程序中的其他步骤

Spring batch 重试失败的写入操作,但不延迟Spring批处理应用程序中的其他步骤,spring-batch,Spring Batch,我正在维护一个使用SpringBatch编写的遗留应用程序,需要对其进行调整,以避免数据丢失。 我必须读取各种Web服务(每个步骤一个),然后写入远程数据库。当与数据库的连接断开时,情况会变得糟糕,因为从webservice读取的所有iTen都被丢弃(不能读取同一项两次),并且数据会因为无法写入而丢失 我需要设置Spring批处理,以便在一个步骤上保留已读取的数据,以便在下一步运行时重试写入操作。在写入操作成功完成之前,同一步骤无法读取更多数据。 当无法写入时,该步骤应保留读取的数据并将执行传递

我正在维护一个使用SpringBatch编写的遗留应用程序,需要对其进行调整,以避免数据丢失。 我必须读取各种Web服务(每个步骤一个),然后写入远程数据库。当与数据库的连接断开时,情况会变得糟糕,因为从webservice读取的所有iTen都被丢弃(不能读取同一项两次),并且数据会因为无法写入而丢失

我需要设置Spring批处理,以便在一个步骤上保留已读取的数据,以便在下一步运行时重试写入操作。在写入操作成功完成之前,同一步骤无法读取更多数据。 当无法写入时,该步骤应保留读取的数据并将执行传递到下一步,过一段时间后,当失败的步骤再次运行时,不应读取另一项,而应重试失败的写入操作

批处理应用程序应该在无限循环中运行,每个步骤都应该从一个不同的源收集数据。失败的写入操作应立即跳过(保留读取数据),以不延迟其他步骤,但应在下次调用时从写入操作恢复

除了官方文档,我还在研究各种网络资源,但SpringBatch并不是我见过的最直观的文档


这能实现吗?如果是,如何写入?

您可以写入所需的数据,以防作业无法写入批处理步骤的ExecutionContext。您可以使用以下数据重新启动作业:

步骤执行由StepExecution类的对象表示。 每次执行都包含对其相应步骤和步骤的引用 作业执行,以及与事务相关的数据,如提交和回滚 计算开始和结束时间。此外,每个步骤的执行都将 包含ExecutionContext,它包含开发人员需要的任何数据 在批处理运行中保持,例如统计信息或状态信息 需要重新启动吗


更多信息来自:

我不知道这是否适合您,但以下是我对您的配置的看法

因为有两个远程源可能会出现故障,所以让我们用两个作业(而不是两个步骤)对整个系统进行分区

工作A

步骤1:小任务 检查共享文件夹中的文件。如果存在文件,请不要继续下一步。在写B工作时会更容易理解

步骤2:文件的Web服务 读取web服务并将结果写入共享文件夹中的扁平文件。由于您将使用flatfiles作为输出,因此您将解决“从webservice读取的所有项都将被丢弃,并且数据将因为无法写入而丢失。”

使用Quartz或同等产品安排此作业

作业B 轮询共享文件夹中生成的文件,并使用该文件(file.getWhere作为jobparameter)创建joblauncher。Spring集成项目可能在这方面有所帮助

步骤1: 读取文件,将其写入远程数据库,如果写入数据库成功,则移动/删除文件

由于作业启动源于轮询的文件,因此不需要计划

样本执行

时间0:共享文件夹中没有文件

时间1:从web服务读取并写入共享文件夹

时间2:作业B文件轮询发生,尝试写入数据库

如果成功,系统将继续执行

否则,当作业A尝试在其计划时间执行时,它将跳过从web服务读取,因为文件仍存在于共享文件夹中。它将跳过,直到作业B使用这些文件

我不想讨论实现细节,但SpringBatch可以处理所有这些情况。希望这有帮助