始终在 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 它了,我的解决方案建立在这个假设上
一步到位就可以
- 实施 LineCallbackHandler
- 给它access to the stepExecutionContext (it's easy with annotations, but can be too with interfaces, just extend StepExecutionListenerSupport)
- 将 header 值保存到 ExecutionContext
- 从上下文中提取它们并在需要的地方使用它们
它也应该适用于 re-start,因为 Spring 批处理 reads/saves 来自第一个 运行 的值,并将为后续 [=33] 提供完整的 ExecutionContext =]s
我正在使用 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 它了,我的解决方案建立在这个假设上
一步到位就可以
- 实施 LineCallbackHandler
- 给它access to the stepExecutionContext (it's easy with annotations, but can be too with interfaces, just extend StepExecutionListenerSupport)
- 将 header 值保存到 ExecutionContext
- 从上下文中提取它们并在需要的地方使用它们
它也应该适用于 re-start,因为 Spring 批处理 reads/saves 来自第一个 运行 的值,并将为后续 [=33] 提供完整的 ExecutionContext =]s