Spring batch 步骤失败时的Spring批处理状态

Spring batch 步骤失败时的Spring批处理状态,spring-batch,Spring Batch,我正在试用春季批。我见过许多通过ItemReader和ItemWriter运行作业的示例。如果作业运行时没有错误,则没有问题。 但我还没有发现在处理了大量记录后,当作业失败时如何处理状态 我的情况非常简单。从xml文件(ItemReader)读取记录并调用外部系统进行存储(ItemWriter)。那么,如果外部系统在进程中间不可用,那么工作状态被设置为失败后会发生什么?如果在外部系统启动并运行的第二天再次手动重新启动作业,我将获得以前加载的记录的副本 在某种程度上,我必须有跳过已加载记录的信息。

我正在试用春季批。我见过许多通过ItemReader和ItemWriter运行作业的示例。如果作业运行时没有错误,则没有问题。 但我还没有发现在处理了大量记录后,当作业失败时如何处理状态

我的情况非常简单。从xml文件(ItemReader)读取记录并调用外部系统进行存储(ItemWriter)。那么,如果外部系统在进程中间不可用,那么工作状态被设置为失败后会发生什么?如果在外部系统启动并运行的第二天再次手动重新启动作业,我将获得以前加载的记录的副本

在某种程度上,我必须有跳过已加载记录的信息。 我曾尝试通过ExecutionContext存储游标,但当我重新启动作业时,我获得了一个新的作业\u执行\u ID,并且游标数据丢失,因为在BATCH\u STEP\u EXECUTION\u CONTEXT.SHORT\u CONTEXT中获取了新行。当do重新启动时,批处理步骤执行。提交步骤执行和批处理步骤执行。读取步骤计数也会重置

我使用JobOperator重新启动作业: jobOperator.restart(jobExecutionId)

是否有一种方法可以在不获取新jobExecutionId的情况下重新启动作业,或者有另一种方法可以获取失败作业的状态。如果有人发现(能够提供)一个包含状态和错误处理的示例,我会很高兴

当然,另一种解决方案是创建自己的表来跟踪已处理的记录,但我真的希望框架有一种机制来实现这一点。否则,我不理解spring batch的想法

问候
Mats

Spring批处理提供的主要功能之一是持久化作业存储库中的作业状态。当作业失败时,在重新启动时,默认行为是作业在失败的步骤重新启动(跳过已成功完成的步骤)。在基于区块的步骤中,我们的大多数阅读器(包括
statxeventitemreader
)将已处理的记录存储在作业存储库中(特别是
ExecutionContext
)。默认情况下,当基于块的步骤失败时,它将在上次失败的块处重新启动,跳过成功处理的块

所有这些的一个例子是,如果你有一份三步走的工作:

<job id="job1">
    <step id="step1" next="step2">
        <tasklet>
            <chunk reader="reader1" writer="writer1" commit-interval="10"/>
        </tasklet>
    </step>
    <step id="step2" next="step3">
        <tasklet>
            <chunk reader="reader2" writer="writer2" commit-interval="10"/>
        </tasklet>
    </step>
    <step id="step3">
        <tasklet>
            <chunk reader="reader3" writer="writer3" commit-interval="10"/>
        </tasklet>
    </step>
</job>

假设这个作业完成了步骤1,然后步骤2有1000条记录要处理,但在记录507处失败。由记录500-510组成的区块将回滚,作业将标记为失败。重新启动该作业将跳过步骤1,跳过步骤2中的记录1-499,并从步骤2的记录500处开始(假设您使用的是有状态项读取器)

关于重启时的jobExecutionId,Spring批处理具有作业实例(逻辑运行)和作业执行(物理运行)的概念。对于每天运行的作业,逻辑运行将是星期一运行、星期二运行等。每种运行都由各自的
JobInstance
组成。如果作业成功,则
JobInstance
最终将只有一个
JobExecution
与其关联。如果失败并重新运行,则每次重新启动作业时都会创建一个新的
JobExecution


您可以在这里找到的Spring批处理文档中阅读有关一般和特定场景中的错误处理的更多信息:

感谢您的支持!我的问题更多的是将状态保持在块中。我的工作只有一个步骤,看起来像这样:读取器读取xml,编写器更新外部资源。still spring批处理是否支持区块内的状态(如果我重新启动作业,如果作业在前一天处理过程中失败,则跳过一些xml记录)?也许另一种选择是有两个没有任何块的步骤?我使用了
JobExecution
作为示例,但是
StepExecution
(及其相关的
ExecutionContext
)在一个步骤中维护状态,包括逐块。在提交每个区块后,步骤的状态(包括已读取的记录数量等)将保留到作业存储库中,以便在发生故障时,重新启动时跳过已处理的记录。