始终在弹簧批处理作业重启时读取前n行

时间:2015-04-06 16:27:05

标签: spring spring-batch

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

提前致谢。

2 个答案:

答案 0 :(得分:3)

你可以在以下地方完成两步工作:

第一步读取前3行作为标题信息,并将您需要的所有内容放入作业上下文(因此,如果作业失败,则将其保存在DB中以供将来执行)。如果此步骤失败,将再次读取标题信息,如果通过,您确定它将始终在作业上下文中包含标题信息。

第二步可以使用相同的文件进行输入,但这次你可以告诉它跳过前3行并按原样阅读休息。通过这种方式,您将获得该步骤的可重新启动性,并且每次作业失败时,它将从其剩余的位置恢复。

答案 1 :(得分:3)

我猜,有问题的文件在运行之间没有变化?那么没有必要重新阅读它,我的解决方案建立在这个假设的基础上

如果你使用一步,你可以

它也可以重新启动,因为Spring Batch从第一次运行中读取/保存值,并为后续运行提供完整的ExecutionContext