【问题标题】:Spring batch file resume after Server failure服务器故障后Spring批处理文件恢复
【发布时间】:2020-03-20 15:19:00
【问题描述】:

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

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

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

我搜索了解决方案,但没有任何相关信息。任何帮助表示赞赏。

【问题讨论】:

    标签: spring-boot spring-data-jpa spring-batch


    【解决方案1】:

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

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

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

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

    按照您需要实施的步骤,

    1.实现一个自定义逻辑来决定最后一个作业执行是成功还是需要重新启动。

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

    有很多场景,例如,

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-02-19
      • 2011-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-02
      • 1970-01-01
      • 1970-01-01
      • 2010-10-20
      相关资源
      最近更新 更多