关于版本

依赖

版本

springboot

2.4.0

spring batch

2.4.0

代码地址

因为每个例子涉及代码较多,且包含测试用例,如果都贴到文章中内容过多,所以只贴出了部分代码。

目录地址

目录

测试目录

内容

dai.samples.batch.allowstart

dai.samples.allow

测试任务可以重复执行

dai.samples.batch.base

dai.samples.base

基础任务配置

dai.samples.batch.skip

dai.samples.skip

跳过操作

dai.samples.batch.listener

dai.samples.listener

任务监听器

dai.samples.batch.process

dai.samples.process

流程控制的代码

dai.samples.batch.add

dai.samples.add

任务流程切割

dai.samples.batch.retry

dai.samples.retry

任务重试

dai.samples.batch.rollback

dai.samples.rollback

任务回滚

dai.samples.batch.rw

dai.samples.rw

数据的读取和输出

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();
    }

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