SpringBatch跳过异常和限制方式

 更新时间:2021年09月07日 16:59:57   作者:篮球场上旧少年  
这篇文章主要介绍了SpringBatch跳过异常和限制方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

SpringBatch容错处理

1. 案例说明

从DB中reader出1000条数据,chunk = 100,当第二个chunk出现NullPointerException或者StringIndexOutOfBoundsException异常。业务要求batch不终了,程序继续执行。

2. 跳过异常限制

下记有两种实现方法。

2.1 skip 和 skipLimit配置

  @Bean
  public Step job1step1() throws Throwable {
    return stepBuilderFactory
        .get(_JOB_STEP_NAME)
          .listener(_stepListener)
          .<Model1, Model2>chunk(_CHUNK_SIZE)
          .reader(reader())
          .processor(processor())
          .writer(writer())
          .faultTolerant()
          .skipLimit(10)
          .skip(NullPointerException.class)
          .skip(StringIndexOutOfBoundsException.class)
          .build();
  }

上记代码示例中的skipLimit方法限制最大跳过数,skip方法限制跳过的异常类型。

这样某条数据出现异常时,并不会终了step,而是跳过本条错误数据,继续处理下一条。

2.2 自定义跳过配置SkipPolicy 接口

SkipPolicy相对于skip更加灵活。

例:业务要求,userId = 110的用户出现上记两个异常时,程序终了。

step代码

  @Bean
  public Step job1step1() throws Throwable {
    return stepBuilderFactory
        .get(_JOB_STEP_NAME)
          .listener(_stepListener)
          .<Model1, Model2>chunk(_CHUNK_SIZE)
          .reader(reader())
          .processor(processor())
          .writer(writer())
          .faultTolerant()
          .skipPolicy(new SkipPolicyTask())
          .build();
  }

自定义SkipPolicy 接口代码

public class SkipPolicyTask implements SkipPolicy {
    private static final int MAX_SKIP_COUNT = 10;
    private static final int USER_ID= 110;
 
    @Override
    public boolean isSkipFlg(Throwable throwable, int skipCount) 
      throws SkipLimitExceededException {
 
        if (throwable instanceof NullPointerException && skipCount < MAX_SKIP_COUNT) {
            return true;
        }
 
        if (throwable instanceof StringIndexOutOfBoundsException && skipCount < MAX_SKIP_COUNT ) {
            if(common.getUserId == INVALID_TX_AMOUNT_LIMIT) {
                return false;
            } else {
                return true;
            }
        }
        return false;
    }
 }

return flase 程序终了,retuen true 跳过异常。

SpringBatch 错误积累

1.如果nextStep在该JOB中还没有配置

也就是说nextStep还不存在的情况下,就会报错

<end on="EIXT WITH IMBALANCE" />
  <next on="BALANCED" to="nextStep" />
<fail on="*" /> 

Caused by: java.lang.IllegalArgumentException: Missing state for [StateTransition: [state=bain_Job.bainToTableStep, pattern=BALANCED, next=bain_Job.trustAcctBatPayStep]]
at org.springframework.batch.core.job.flow.support.SimpleFlow.initializeTransitions(SimpleFlow.java:283) ~[spring-batch-core-3.0.0.RELEASE.jar:3.0.0.RELEASE]
at org.springframework.batch.core.job.flow.support.SimpleFlow.afterPropertiesSet(SimpleFlow.java:128) ~[spring-batch-core-3.0.0.RELEASE.jar:3.0.0.RELEASE]
at org.springframework.batch.core.configuration.xml.SimpleFlowFactoryBean.getObject(SimpleFlowFactoryBean.java:125) ~[spring-batch-core-3.0.0.RELEASE.jar:3.0.0.RELEASE]
at org.springframework.batch.core.configuration.xml.SimpleFlowFactoryBean.getObject(SimpleFlowFactoryBean.java:46) ~[spring-batch-core-3.0.0.RELEASE.jar:3.0.0.RELEASE]
at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:168) ~[spring-beans-4.1.5.RELEASE.jar:4.1.5.RELEASE]
... 42 common frames omitted

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • JAVA内存模型和Happens-Before规则知识点讲解

    JAVA内存模型和Happens-Before规则知识点讲解

    在本篇文章里小编给大家整理的是一篇关于JAVA内存模型和Happens-Before规则知识点内容,有需要的朋友们跟着学习下。
    2020-11-11
  • Mybatis plus关闭驼峰命名的四种方法(防止出现查询为Null)

    Mybatis plus关闭驼峰命名的四种方法(防止出现查询为Null)

    这篇文章主要介绍了Mybatis plus关闭驼峰命名的四种方法(防止出现查询为Null),数据库的字段命名方式为使用下划线连接,对应的实体类应该是驼峰命名方式,而我使用的是和数据库同样的命名方式,需要的朋友可以参考下
    2022-01-01
  • Java 如何在switch case语句中声明变量

    Java 如何在switch case语句中声明变量

    这篇文章主要介绍了Java 如何在switch case语句中声明变量,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • java测试框架的方法

    java测试框架的方法

    这篇文章主要介绍了java测试框架的方法,文中代码非常详细,供大家学习和参考,感兴趣的朋友可以了解下
    2020-06-06
  • 使用Java编写GUI对话框的教程

    使用Java编写GUI对话框的教程

    这篇文章主要介绍了使用Java编写GUI对话框的教程,是Java图形化编程中的基础知识,需要的朋友可以参考下
    2015-10-10
  • 简述JAVA中堆内存与栈内存的区别

    简述JAVA中堆内存与栈内存的区别

    这篇文章主要介绍了JAVA中堆内存与栈内存的区别,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • 一文教会Java新手使用Spring MVC中的查询字符串和查询参数

    一文教会Java新手使用Spring MVC中的查询字符串和查询参数

    在使用springMVC框架构建web应用,客户端常会请求字符串、整型、json等格式的数据,这篇文章主要给大家介绍了关于通过一文教会Java新手使用Spring MVC中的查询字符串和查询参数的相关资料,需要的朋友可以参考下
    2024-01-01
  • 看过就懂的java零拷贝及实现方式详解

    看过就懂的java零拷贝及实现方式详解

    这篇文章主要为大家详细的介绍了什么是零拷贝,传统的IO执行流程,零拷贝相关的知识点回顾,零拷贝实现的几种方式及java提供的零拷贝方式相关内容,有需要的朋友可以借鉴参考下
    2022-01-01
  • SpringBoot压缩json并写入Redis的示例代码

    SpringBoot压缩json并写入Redis的示例代码

    由于业务需要,存入redis中的缓存数据过大,占用了10+G的内存,内存作为重要资源,需要优化一下大对象缓存,所以我们需要对json进行压缩,本文给大家介绍了SpringBoot如何压缩Json并写入redis,需要的朋友可以参考下
    2024-08-08
  • Java动态代理分析及简单实例

    Java动态代理分析及简单实例

    这篇文章主要介绍了 Java动态代理分析及简单实例的相关资料,需要的朋友可以参考下
    2017-02-02

最新评论