我已经配置了Spring Boot Batch以处理固定长度的平面文件。我使用FlatFileItemReader,FixedLengthTokenizer读取和拆分列,并使用ItemWriter,JPA存储库将数据写入数据库。
我遇到的情况是,“我的服务器”崩溃或在文件处理时停止。此时,文件的一半已被处理(意味着一半的数据写入了DB)。当涉及下一个Job(服务器正在运行时)时,文件必须从停止位置开始。
例如,一个具有1000行的文件,服务器在处理500行之后被关闭。在下一个作业中,文件必须从501行开始。
我用谷歌搜索了解决方案,但没有任何关系。任何帮助表示赞赏。
答案 0 :(得分:1)
据我所知,Spring Batch API中并不自动存在您要问的内容(在块级别重新启动),并且程序员必须自己实现。
Spring Batch通过JobOperator.restart提供了作业重启功能。这是作业级别的重新启动,并且将为下一次运行创建新的执行ID,并且整个作业将重新运行,因为还有其他一些问题,例如有人将新文件放在文件中或将现有文件重命名以代替旧文件进行处理,如何进行批处理会知道自上次运行以来,其相同的输入文件内容明智还是db没有改变?
由于这些问题,程序员必须通过自定义代码处理这些情况。
第二个问题是,当服务器发生故障时,作业状态仍然是STARTED
而不是FAILED
,因为它突然发生并且框架无法正确更新状态。
按照您需要实施的步骤
1。实施自定义逻辑,以决定上一次作业执行成功还是需要重启。
2。如果需要重新启动,请将先前的作业执行标记为FAILED
,然后使用JobOperator.restart(long executionId)
-对于非分区作业,唯一有用的影响是将作业状态标记为正确FAILED
,但整个工作将从头开始。
有很多情况,例如
a)职位状态为STARTED
,但所有步骤均标记为COMPELTED
等
b)对于分区作业,只需完成很少的步骤,很少的失败和很少的启动操作,等等
3。如果不需要重新启动,请使用-JobLauncher.run启动新作业。
因此,通过上述步骤,您会看到真正的块级作业重新启动未实现,但是以上步骤是您首先需要了解和实现的主要内容。
下一步将是在作业重新启动时更改您的输入,即您设计了一种机制,以将输入记录标记为已处理块(即读取,已处理和已写入)的已处理,并有一种方法可以知道什么输入记录未处理-然后在下一个作业运行中,您输入仍未处理的修改后的输入。因此,所有这些将成为您的用例特定的自定义逻辑。
我不知道框架本身有任何内置机制可以实现这一目标。对我来说,“重新启动工作”是一种全新的工作执行方式,其输入经过修改/减少。