我试着弹出批处理。通过ItemReader和ItemWriter运行作业时,我见过很多示例。如果一项工作没有错误地运行,没有问题。 但是我还没有找到如何处理一个作业失败后,处理大量的记录状态。弹出批处理状态,当步骤失败
我的场景很简单。从xml文件(ItemReader)读取记录并调用外部系统进行存储(ItemWriter)。那么如果外部系统在进程中间不可用并且一段时间后作业状态设置为FAILED,会发生什么情况?如果我在外部系统启动并运行的第二天再次手动重新启动作业,那么我将得到以前加载的记录的重复项。
在某些方面,我必须有用于跳过已经加载的记录的信息。 我试图通过ExecutionContext存储游标,但是当我重新启动作业时,我得到一个新的JOB_EXECUTION_ID,并且游标数据丢失,因为BATCH_STEP_EXECUTION_CONTEXT.SHORT_CONTEXT中有一个新行。重新启动时,BATCH_STEP_EXECUTION.COMMIT_COUNT和BATCH_STEP_EXECUTION.READ_COUNT也会重置。
我使用JobOperator重新启动作业: jobOperator.restart(jobExecutionId);
有没有办法重新启动一项工作,而无需获得新的jobExecutionId或交替的方式来获取失败的工作状态。如果有人发现(可以提供)示例包含状态和错误处理,我会很高兴。
一个替代解决方案当然是创建我自己的表来保存已处理记录的轨迹,但我真的希望框架有一个机制。否则,我不会用春天的批次来说明这个想法。
问候 垫
谢谢支持!我的问题更多地是关于在一个块内保持状态。我的工作只有一个步骤,如下所示: 阅读器读取xml并且编写器更新外部资源。块内是否仍然支持spring-batch状态(如果我重新启动作业,如果在前一天处理过程中作业失败,则跳过一些xml记录)?也许替代方案是有两个步骤没有任何块呢? –
Mats
然而,我使用'JobExecution'作为例子,'StepExecution'(和它的相关的'ExecutionContext')在一个步骤中保持状态,包括由块组成的块。在每个块提交之后,步骤的状态(包括已读取的记录数等)将保存到作业存储库中,以便发生故障时,已重新处理的记录将被跳过。 –