Spring Boot 整合——Spring batch重试和回滚

关于版本

依赖版本
springboot2.4.0
spring batch2.4.0

代码地址

因为每个例子涉及代码较多,且包含测试用例,如果都贴到文章中内容过多,所以只贴出了部分代码。全部的代码在这里: https://gitee.com/daifyutils/springboot-samples

此篇文章所属模块为:base-batch-2.4.0

目录地址

目录测试目录内容
dai.samples.batch.allowstartdai.samples.allow测试任务可以重复执行
dai.samples.batch.basedai.samples.base基础任务配置
dai.samples.batch.skipdai.samples.skip跳过操作
dai.samples.batch.listenerdai.samples.listener任务监听器
dai.samples.batch.processdai.samples.process流程控制的代码
dai.samples.batch.adddai.samples.add任务流程切割
dai.samples.batch.retrydai.samples.retry任务重试
dai.samples.batch.rollbackdai.samples.rollback任务回滚
dai.samples.batch.rwdai.samples.rw数据的读取和输出

Spring Batch其他内容

Spring Boot 整合——Spring batch基本使用

Spring Boot 整合——Spring batch的监听器

Spring Boot 整合——Spring batch任务流程控制以及流程分割

Spring Boot 整合——Spring batch通过不同方式读取数据(ItemReader)

Spring Boot 整合——Spring batch通过不同方式输出数据(ItemWriter)

Spring Boot 整合——Spring batch重试和回滚

Spring batch

spring batch 是spring提供的一个批数据处理的框架。提供了大量信息的自动化和定时处理的操作。其是一个相对轻量级的批处理操作

Spring batch 重试策略

对于简单情况Spring Batch提供了简单的参数控制重试的触发异常和次数,但是对于负责的重试,Spring提供了比较复杂的模板,其内容直接导致被分离出Spring Retry这个项目

简单的重试

在执行任务的时候可以通过设置retryLimitretry来设置,在遇见哪些异常需要进行重试,以及重试的次数。需要注意的是,当出现问题的时候重试是基于chunk来进行重试的而不是单独的某一条数据

    /**
     * 遇见RetryException异常进行重试,重试3次
     * @return
     */
    @Bean("retryStep")
    public Step retryStep() {
        return this.stepBuilderFactory.get("retryStep")
                .<BatchEntity, BatchEntity>chunk(1)
                .reader(itemReader())
                .processor(getProcessor())
                .writer(itemWriter())
                .faultTolerant()
                .retryLimit(3)
                .retry(RetryException.class)
                .noRetry(RuntimeException.class)
                .build();
    }

使用RetryPolicy的重试

很多时候我们进行重试的时候涉及不同的业务场景和硬件环境,要考虑的问题和逻辑要复杂的多,Spring提供了丰富的重试功能,其将此功能独立出来形成了Spring Retry组件。当然这次只是介绍Spring Batch关于Retry的内容后续在介绍。这里只是简单介绍下其RetryPolicy的使用。

上面方法中的重试异常以及重试次数的配置可以使用下面的方式

    public Step retryStepOption() {
        return this.stepBuilderFactory.get("retryPolicy")
                .<BatchEntity, BatchEntity>chunk(1)
                .reader(itemReader())
                .processor(getProcessor())
                .writer(itemWriter())
                .faultTolerant()
                .retryPolicy(getRetryPolicy())
                .build();
    }

其需要传递一个retryPolicy的实现类,而上面的例子用retryPolicy实现就是。当然其配合RetryOperationsRetryTemplateRetryContext就能提供更加完善的重试策略。这个功能后续在Spring Retry里面再介绍

    public RetryPolicy getRetryPolicy() {
        // 重试的异常集合
        Map<Class<? extends Throwable>, Boolean> classBooleanMap =
                Collections.singletonMap(Exception.class, true);
        // 参数为: 重试次数、重试的异常集合
        return new SimpleRetryPolicy(3, classBooleanMap);
    }

Spring batch任务回滚

在任务执行的时候,有时间我们遇见一些错误的时候,Batch默认chunk中有数据异常整个chunk会被回滚,但是在某些场景下我们并不希望所有的处理都被回滚掉。这里Batch提供了noRollback参数。

通过配置此参数的内容我们可以指定,让任务遇见了某些异常的时候会将chunk中正确的任务执行下去。

    /**
     * 遇见RuntimeException异常不进行事务回滚
     * @return
     */
    @Bean("rollBackErrorStep")
    public Step rollBackErrorStep() {
        return this.stepBuilderFactory.get("rollBackErrorStep")
                .<BatchEntity, BatchEntity>chunk(4)
                .reader(itemReader())
                .processor(getProcessor())
                .writer(dbWriter)
                .faultTolerant()
                .noRollback(RuntimeException.class)
                .build();
    }

个人水平有限,上面的内容可能存在没有描述清楚或者错误的地方,因为每一个例子都提供了测试代码,一般来说不会有问题,但是因为这几篇内容断断续续用了一个半月可能会出现之后的代码影响了之前的例子,假如开发同学发现了,请及时告知,我会第一时间修改相关内容,也希望大家看在这个新春佳节只能宅到家中埋头苦逼的码代码的情况下,能给我点一个赞。你的点赞就是我前进的动力。

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大·风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值