始终在 spring 批处理作业重新启动时读取前 n 行

Always read first n lines on spring batch job restart

我正在使用 spring 批处理模块读取包含 multi-line 条记录的复杂文件。文件中的前 3 行将始终包含一个 header 和几个公共字段。 这些公共字段将用于文件中后续记录的处理。该作业可重新启动。 假设输入文件有 10 条记录(请注意记录数可能与行数不同,因为记录可以跨越多行)。 假设作业 运行s 第一次,从第 1 行开始读取文件,处理前 5 条记录并在处理第 6 条记录时失败。 在第一个 运行 期间,由于作业还解析了 header 部分(文件中的前 3 行),应用程序可以成功处理前 5 条记录。 现在,当失败的作业重新启动时,它将从第 6 条记录开始,因此这次不会读取 header 部分。由于应用程序需要某些值 包含在 header 记录中,作业失败。我想知道可能的建议,以便重新启动的作业始终读取 header 部分然后开始 从它停止的地方开始(上述场景中的第 6 条记录)。

提前致谢。

你可以做两步工作:

第一步 读取前 3 行作为 header 信息,并将您需要的所有内容放入作业上下文(因此将其保存在数据库中以备将来在作业失败时执行) .如果此步骤失败,将再次读取 header 信息,如果通过,您确定它在作业上下文中将始终具有 header 信息。

第二步 可以使用相同的文件进行输入,但这次您可以告诉它跳过前 3 行并按原样读取其余部分。这样你就可以在那个步骤上重新启动,每次作业失败时它都会从它离开的地方恢复。

我猜,有问题的文件在 运行 之间没有变化?那么就没有必要 re-read 它了,我的解决方案建立在这个假设上

一步到位就可以

它也应该适用于 re-start,因为 Spring 批处理 reads/saves 来自第一个 运行 的值,并将为后续 [=33] 提供完整的 ExecutionContext =]s