Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot 服务器故障后恢复Spring批处理文件_Spring Boot_Spring Data Jpa_Spring Batch - Fatal编程技术网

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

Spring boot 服务器故障后恢复Spring批处理文件,spring-boot,spring-data-jpa,spring-batch,Spring Boot,Spring Data Jpa,Spring Batch,我已经将SpringBoot批处理配置为处理固定长度的平面文件。我使用FlatFileItemReader、FixedLengthTokenizer读取和拆分列,并使用ItemWriter、JPA存储库将数据写入数据库 我有这样一个场景,我的服务器崩溃或在文件处理时停止。此时,处理了文件的一半(表示写入数据库的数据的一半)。当涉及到下一个作业时(服务器运行时),文件必须从停止的位置开始 例如,一个文件有1000行,服务器在处理500行后关闭。在下一个作业中,文件必须从501行开始 我在谷歌上搜索

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

我有这样一个场景,我的服务器崩溃或在文件处理时停止。此时,处理了文件的一半(表示写入数据库的数据的一半)。当涉及到下一个作业时(服务器运行时),文件必须从停止的位置开始

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


我在谷歌上搜索解决方案,但没有相关内容。感谢您的帮助。

据我所知,您所要求的(在块级别重新启动)不会自动存在于Spring批处理API中&程序员必须自己实现

SpringBatch通过提供作业重启功能。这是一个作业级重新启动,将为下一次运行创建一个新的执行id&整个作业将重新运行,因为还有其他问题,如有人放入新文件或重命名现有文件以代替旧文件进行处理,批处理如何知道自上次运行以来,其相同的输入文件内容或db未更改

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

第二个问题是,当服务器出现故障时,作业状态仍然是
已启动
&而不是
失败
,因为这是突然发生的,框架无法正确更新状态

您需要执行以下步骤:

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

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

有很多这样的场景,

a) 作业状态为
已启动
,但所有步骤都标记为
已完成

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

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

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

下一步是在作业重新启动时更改输入,即设计一种机制,将已处理的块(即读取、处理和写入)的输入记录标记为已处理的,并有一种方法知道哪些输入记录未处理-然后在下一次作业运行中,输入仍未处理的修改输入。因此,它将成为您特定于用例的定制逻辑

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