我正在维护使用Spring Batch编写的遗留应用程序,需要调整它以永远不会丢失数据。 我必须从各种webservice(每个步骤一个)读取,然后写入远程数据库。当与DB的连接丢失时,事情变得糟糕,因为从webservice读取的所有itens都被丢弃(无法读取相同的项目两次),并且数据因为无法写入而丢失。
我需要设置Spring Batch以保持已经读取数据的一步,以便在下一步运行时重试写入操作。在写操作成功结束之前,同一步骤无法读取更多数据。 当无法写入时,该步骤应该保留读取数据并将执行传递到下一步,一段时间后,当失败步骤再次运行时,它不应该读取另一个项目,而是重新尝试失败的写入操作
批处理应用程序应在无限循环中运行,每个步骤应从一个不同的源收集数据。应该暂时跳过写入操作失败(保持读取数据)不延迟其他步骤,但应在下次调用时从写入操作中恢复。
我正在研究除官方文档之外的各种网络资源,但Spring Batch并没有我遇到的最直观的文档。
这可以实现吗?如果是,怎么样?
答案 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可以处理所有这些情况。希望这会有所帮助。