gpt4 book ai didi

spring-boot - 服务器故障后 Spring 批处理文件恢复

转载 作者:行者123 更新时间:2023-12-04 10:58:16 25 4
gpt4 key购买 nike

我已将 Spring Boot Batch 配置为处理固定长度的平面文件。我使用 FlatFileItemReader、FixedLengthTokenizer 读取和拆分列,并使用 ItemWriter、JPA 存储库将数据写入数据库。

我有这样的场景,我的服务器崩溃了或者在文件处理时停止了。此时已经处理了一半的文件(意味着一半的数据写入了DB)。当涉及到下一个作业时(当服务器正在运行时),文件必须从它停止的地方开始。

例如,一个文件有 1000 行,服务器在处理 500 行后关闭。在下一个作业中,文件必须从 501 行开始。

我在谷歌上搜索了解决方案,但没有任何相关内容。任何帮助表示赞赏。

最佳答案

据我所知,您所要求的(在 block 级别重新启动)不会自动存在于 Spring Batch API 中,并且程序员必须自己实现。

Spring Batch 通过 JobOperator.restart 提供作业重启功能.这是一个作业级别的重新启动,将为下一次运行创建一个新的执行 ID 并且整个作业将重新运行,因为还有其他问题,例如有人放入新文件或重命名现有文件以代替旧文件进行处理,如何批处理将知道其相同的输入文件内容明智或数据库自上次运行以来未更改?

由于这些问题,程序员必须通过自定义代码来处理这些情况。

第二个问题是,当服务器发生故障时,作业状态仍将是 STARTED 而不是 FAILED 因为它突然发生并且框架无法更新状态正确。

按照您需要执行的步骤,

1.实现自定义逻辑来决定上次作业执行是否成功或是否需要重新启动。

2.如果需要重新启动,将之前的作业执行标记为FAILED & 然后使用JobOperator.restart(long executionId) - 对于非分区作业,仅有用影响将是将作业状态标记为正确的 FAILED 但整个作业将从头开始。

有很多场景,比如,

a) 作业状态为STARTED 但所有步骤都标记为COMPELTED

b)对于分区作业,完成的步骤很少,失败的很少,启动的很少等

3.如果不需要重新启动,使用 - JobLauncher.run 启动新作业.

因此,通过上述步骤,您会看到真正的 block 级作业重启并未实现,但上述步骤是您首先需要了解和实现的主要内容。

下一步是在作业重新启动时更改输入,即您设计一种机制将输入记录标记为已处理 block (即读取、处理和写入)的已处理,并有办法知道输入是什么记录未处理 - 然后在下一次作业运行中,您提供仍未处理的修改输入。所以这一切都将成为您的用例特定的自定义逻辑。

我不知道框架本身有任何内置机制来实现这一点。对我来说,Job Restart 是一种全新的作业执行,具有修改/减少的输入。

关于spring-boot - 服务器故障后 Spring 批处理文件恢复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59030026/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com