在不延迟Spring Batch应用程序中的其他步骤的情况下重试写入操作失败

时间:2012-12-16 19:45:37

标签: spring-batch

我正在维护使用Spring Batch编写的遗留应用程序,需要调整它以永远不会丢失数据。 我必须从各种webservice(每个步骤一个)读取,然后写入远程数据库。当与DB的连接丢失时,事情变得糟糕,因为从webservice读取的所有itens都被丢弃(无法读取相同的项目两次),并且数据因为无法写入而丢失。

我需要设置Spring Batch以保持已经读取数据的一步,以便在下一步运行时重试写入操作。在写操作成功结束之前,同一步骤无法读取更多数据。 当无法写入时,该步骤应该保留读取数据并将执行传递到下一步,一段时间后,当失败步骤再次运行时,它不应该读取另一个项目,而是重新尝试失败的写入操作

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

我正在研究除官方文档之外的各种网络资源,但Spring Batch并没有我遇到的最直观的文档。

这可以实现吗?如果是,怎么样?

2 个答案:

答案 0 :(得分:0)

如果作业未能通过Batch Step的ExecutionContext,您可以编写需要保留的数据。您可以使用以下数据重新启动作业:

  

步骤执行由StepExecution类的对象表示。   每个执行都包含对其相应步骤的引用   JobExecution和事务相关的数据,如提交和回滚   计数,开始和结束时间。另外,每一步执行都会   包含ExecutionContext,其中包含开发人员需要的任何数据   持续跨批处理运行,例如统计信息或状态信息   需要重启

更多来自:http://static.springsource.org/spring-batch/reference/html/domain.html#domainStepExecution

答案 1 :(得分:0)

我不知道这对你是否合适,但这是我对你的配置的看法。

由于您有两个可能出现故障的远程源,让我们用两个作业(而不是两个步骤)对整个系统进行分区

JOB A

第1步:Tasklet 检查共享文件夹中的文件。如果存在文件,请不要继续执行下一步。在写关于JOB B

时会更容易理解

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

使用Quartz或同等程序来安排这项工作。

JOB B 轮询生成文件的共享文件夹,并使用该文件创建一个joblauncher(file.getWhere作为作业参数)。 Spring集成项目可能有助于此轮询。

第1步: 如果写入db成功,则从文件中读取,将它们写入远程数据库并移动/删除文件。

由于作业启动源自轮询的文件,因此不需要进行任何计划。

示例执行

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

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

时间2:发生作业B文件轮询,尝试写入db。

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

如果没有,当作业A尝试在其预定时间执行时,它将跳过从Web服务读取,因为文件仍存在于共享文件夹中。它将跳过,直到作业B使用文件。

我不想进入实现细节,但Spring Batch可以处理所有这些情况。希望这会有所帮助。