Spring Batch重试(restart)原理

本文详细介绍了Spring Batch中用于管理Job实例和执行情况的表结构,包括如何通过这些表实现Job的重启,确保任务能够顺利完成。特别关注了Job实例、执行参数及执行情况等关键概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

保存元数据的表
batch_job_execution
batch_job_execution_context
batch_job_execution_params
batch_job_execution_seq
batch_job_instance
batch_job_seq
batch_step_execution
batch_step_execution_context
batch_step_executon_seq

restart会用到的三张表

batch_job_instance           实例ID 和 job 名字
batch_job_execution          job执行情况
batch_job_execution_params   job每次执行启动的参数
JobInstance
  • Job 实例
spring batch 通过 job id 和 启动参数 来唯一确定一个job 实例
如果同一个job 启动参数有变化,会重新创建一个job实例。
参数没有变化,job重新启动,重新创建一个 jobExection 记录执行情况。
JobParameters
  • Job 启动参数:用来唯一确定一个 jobInstance
JobExecution
  • Job 执行情况:记录每个jobInstance的每次执行情况
restart 实例 表数据的变化
重启一个失败的job ,让job 能够最终完成。
系统要重启某个特定失败的job, 得从batch_job_execution_params 查到当时的参数,以此为依据启动job。

假设日终处理_结息任务,在6月1号晚上10点开始,10:30前结束,但是job 失败了
此时表中数据应该是:

batch_job_instance :有一个名字为 日终处理_结息任务的Job 实例。(一条记录)
batch_job_execution  :有个开始时间为 XXXX-06-01 22:00 结束时间为XXXX-06-01 22:30  状态为 FAILED 的执行情况记录。(一条记录)
batch_job_execution_params: 该失败实例的第一次执行的参数。

mark

因为 该任务是定时任务,所以在当天特定时刻 再次执行同样参数的job 以便重启1号的job, 让其成功。

这个时候表中数据应该为:

batch_job_instance :不变,依然为当时的实例(参数没发生变化)
batch_job_execution :新增一条,start_time不变与上一次执行开始时间一致,end_time改变(为此次执行结束时间),status为完成 COMPLETED
batch_job_execution_params: 新增一条与上一条一模一样的记录

mark

注:图来自官网,因为官网的例子是定时任务,是在第二天同一时刻重启,重启成功后又开始当天的任务,所有有两个job_instance,相应的多出一条  execution 和 execution params
<think>好的,我现在需要为用户讲解Spring Batch中的SkipLimit。首先,我得回忆一下自己对SkipLimit的理解,确保没有记错。然后,思考如何组织语言,让用户能逐步理解这个概念。 首先,用户可能已经知道Spring Batch是处理批量任务的框架,但可能对错误处理机制不太清楚。SkipLimit是错误处理的一部分,用于控制允许跳过的异常次数。需要先介绍Skip机制的整体作用,再引出SkipLimit的重要性。 接下来,我需要分步骤解释。第一步,说明Skip机制是什么,允许在读取、处理或写入数据时跳过某些错误,继续处理后续的数据。然后,自然过渡到SkipLimit,说明它是用来限制允许跳过的次数,超过这个限制作业就会失败。 然后,可能需要举一个例子,比如配置一个SkipLimit为10的情况,当第11次错误发生时,作业停止。这样用户能更直观地理解。 还要提到应用场景,比如数据清洗时部分数据格式错误,允许跳过这些错误继续处理其他数据。但需要强调,并非所有异常都应该跳过,只有可恢复的或可忽略的异常才配置跳过。 接下来,用户可能会想知道如何配置,需要简要说明在Step配置中使用skipLimit方法,并指定异常类型。例如,在代码中.skip(MyException.class).skipLimit(10)。这里要注意,可能需要解释不同的组件(reader, processor, writer)如何单独设置Skip策略,或者全局设置。 另外,需要区分SkipLimit和RetryLimit的不同,避免用户混淆。Retry是重试,而Skip是跳过继续处理,两者可以结合使用。 在结构上,先定义,再作用,配置方法,示例,注意事项,最后与其他机制对比。这样用户能逐步深入理解。 现在检查是否有遗漏的点,比如SkipLimit的默认值是多少?默认应该是0,也就是不允许跳过,需要显式配置。这点可能需要提到。 还要确保术语使用正确,比如Step、Chunk等术语是否正确使用。可能需要提到在基于块的步骤中配置SkipLimit。 最后,确认所有解释符合Spring Batch的官方文档,避免给出错误信息。比如,SkipLimit的具体配置方法是否正确,是否需要结合skip和skipLimit方法使用。 总结思考步骤后,整理成结构清晰的回答,用中文表达,确保每个部分自然衔接,用户容易理解。</think>在Spring Batch中,**SkipLimit** 是一个关键的错误处理机制,用于控制作业在遇到可跳过的异常时继续执行的容错能力。以下是逐步解析: --- ### 1. Skip机制的作用 Spring Batch的 **Skip机制** 允许在以下场景中跳过错误项,继续处理后续数据: - **读取阶段(Read)**:如文件某行格式错误。 - **处理阶段(Process)**:如业务逻辑校验失败。 - **写入阶段(Write)**:如数据库插入违反约束。 通过跳过非致命错误,保证作业的持续执行,而非直接失败。 --- ### 2. SkipLimit的定义 - **SkipLimit** 是一个整数值,表示允许跳过的最大异常次数。 - 当跳过的异常次数超过此限制时,作业会立即失败(抛出 `SkipOverflowException`)。 - 例如:若设置 `skipLimit=5`,第6次跳过时会终止作业。 --- ### 3. 如何配置SkipLimit 在定义作业步骤(`Step`)时,通过链式方法配置: ```java @Bean public Step myStep() { return stepBuilderFactory.get("myStep") .<Input, Output>chunk(10) .reader(reader()) .processor(processor()) .writer(writer()) .faultTolerant() .skip(MyException.class) // 指定跳过的异常类型 .skipLimit(5) // 设置最大跳过次数 .build(); } ``` - **`.skip(异常类)`**:明确哪些异常可跳过(如数据格式错误)。 - **`.skipLimit(n)`**:设置跳过的上限。 --- ### 4. 示例场景 假设一个数据清洗作业: - 配置 `skipLimit=3`,跳过 `DataFormatException`。 - 当第4次遇到相同异常时,作业失败。 --- ### 5. 注意事项 - **精确指定异常类型**:避免跳过不应忽略的异常(如系统级错误)。 - **与Retry结合**:可配合重试机制(`retryLimit`)先重试再跳过。 - **性能影响**:频繁跳过可能降低效率,需权衡容错与性能。 --- ### 6. SkipLimit与其他机制对比 | 机制 | 行为 | 适用场景 | |------------|--------------------|------------------------------| | Skip | 跳过当前项继续处理 | 可忽略的局部错误(如单条数据) | | Retry | 重试失败操作 | 临时性错误(如网络波动) | | Restart | 重启整个作业 | 持久化错误后的恢复 | --- ### 总结 通过合理配置 **SkipLimit**,可以显著提升Spring Batch作业的健壮性,确保在部分数据处理失败时仍能完成批量任务。核心原则是:**明确可跳过的异常类型,并设置合理的跳过次数阈值**。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值