SpringBatch跳过异常和限制方式

目录
  • SpringBatch容错处理
    • 1. 案例说明
    • 2. 跳过异常限制
  • SpringBatch 错误积累
    • 1.如果nextStep在该JOB中还没有配置

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

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

(0)

相关推荐

  • 详解Spring全局异常处理的三种方式

    在J2EE项目的开发中,不管是对底层的数据库操作过程,还是业务层的处理过程,还是控制层的处理过程,都不可避免会遇到各种可预知的.不可预知的异常需要处理.每个过程都单独处理异常,系统的代码耦合度高,工作量大且不好统一,维护的工作量也很大. 那么,能不能将所有类型的异常处理从各处理过程解耦出来,这样既保证了相关处理过程的功能较单一,也实现了异常信息的统一处理和维护?答案是肯定的.下面将介绍使用Spring MVC统一处理异常的解决和实现过程 使用Spring MVC提供的SimpleMappingE

  • 详解SpringBoot和SpringBatch 使用

    什么是Spring Batch Spring Batch 是一个轻量级的.完善的批处理框架,旨在帮助企业建立健壮.高效的批处理应用.Spring Batch是Spring的一个子项目,使用Java语言并基于Spring框架为基础开发,使的已经使用 Spring 框架的开发者或者企业更容易访问和利用企业服务. Spring Batch 提供了大量可重用的组件,包括了日志.追踪.事务.任务作业统计.任务重启.跳过.重复.资源管理.对于大数据量和高性能的批处理任务,Spring Batch 同样提供了

  • Spring boot项目中异常拦截设计和处理详解

    背景: 项目运行过程中会出现各种各样的问题,常见的有以下几种情况: 业务流程分析疏漏,对业务流程的反向操作.边界分析设计不充分 调用外部服务.调用外部系统出现的超时.错误.返回值与预期不符 外部资源连通性问题,db等服务器出现的网络抖动或宕机 无论是分析设计.开发.测试.线上都需要能够准确定位问题并制定解决方案. 目的: 规范化异常的处理过程,避免异常被吞和到处都在捕获异常的情况 准确的反馈异常信息,为定位问题提供依据 通用性异常全局处理,降低业务开发关注度 对异常情况进行预警,以便能够及时响应

  • Spring框架十一种常见异常的解决方法汇总

    在程序员生涯当中,提到最多的应该就是SSH三大框架了.作为第一大框架的Spring框架,我们经常使用. 然而在使用过程中,遇到过很多的常见异常,我在这里总结一下,大家共勉. 一.找不到配置文件的异常 org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from class path resource [com/herman/ss/controller];

  • SpringBatch跳过异常和限制方式

    目录 SpringBatch容错处理 1. 案例说明 2. 跳过异常限制 SpringBatch 错误积累 1.如果nextStep在该JOB中还没有配置 SpringBatch容错处理 1. 案例说明 从DB中reader出1000条数据,chunk = 100,当第二个chunk出现NullPointerException或者StringIndexOutOfBoundsException异常.业务要求batch不终了,程序继续执行. 2. 跳过异常限制 下记有两种实现方法. 2.1 skip

  • python中设置超时跳过,超时退出的方式

    在工作中遇到过 个问题 执行一条代码时间过长 而且还不报错,卡死在那.还要继续执行下面代码,如何操作. 下面是个简单的实例 pip安装 第三方eventlet这个包 – pip install eventlet import time import eventlet#导入eventlet这个模块 eventlet.monkey_patch()#必须加这条代码 with eventlet.Timeout(2,False):#设置超时时间为2秒 time.sleep(4) print('没有跳过这条

  • Python 输出详细的异常信息(traceback)方式

    问题描述 为了程序的正常运行,进行异常处理是有必要的,甚至于有时候,我们会主动的抛出异常,然后让程序进行异常捕获,再进行进一步的处理.但是,在开发的程序相对较大的过程中,我们不能一昧的进行try....except.而是要弄清楚到底抛出的是什么异常,同时,对于某些未知的异常,我们应该清楚的定位到到底是哪一行程序抛出的异常,针对这种情况,traceback库能极大的帮助我们. 解决方法 代码只需一行,即 print(traceback.format_exc()) 即可,这样即可打印详细的信息,这个

  • vue路由跳转传递参数的方式总结

    日常业务中,路由跳转的同时传递参数是比较常见的,传参的方式有三种: 1)通过动态路由方式 //路由配置文件中 配置动态路由 { path: '/detail/:id', name: 'Detail', component: Detail } //跳转时页面 var id = 1; this.$router.push('/detail/' + id) //跳转后页面获取参数 this.$route.params.id 2)通过query属性传值 //路由配置文件中 { path: '/detail

  • Springboot处理异常的常见方式

    一.制造异常 报500错误.在大量的代码中很难找到错误 二.统一异常处理 添加异常处理方法 GlobalExceptionHandler.java中添加 //指定出现什么异常执行这个方法 @ExceptionHandler(Exception.class) @ResponseBody //为了返回数据 public R error(Exception e) { e.printStackTrace(); return R.error().message("执行了全局异常处理.."); }

  • Java常见异常及处理方式总结

    一.概述 异常指不期而至的各种状况,它在程序运行的过程中发生.作为开发者,我们都希望自己写的代码 永远都不会出现 bug,然而现实告诉我们并没有这样的情景.如果用户在程序的使用过程中因为一些原因造成他的数据丢失,这个用户就可能不会再使用该程序了.所以,对于程序的错误以及外部环境能够对用户造成的影响,我们应当及时报告并且以适当的方式来处理这个错误. 之所以要处理异常,也是为了增强程序的鲁棒性. 异常都是从 Throwable 类派生出来的,而 Throwable 类是直接从 Object 类继承而

  • Vue路由跳转的4种方式小结

    目录 1. 标签路由 router-link 2.编程式路由 this.$router.push() 3.this.$router.replace()(与this.$router.push()类似) 4.this.$router.go(n) 5.this.$router.push().this.$router.replace().this.$router.go(n)区别 router-view 实现路由内容的地方,引入组件时写到需要引入的地方,需要注意的是,使用vue-router控制路由则必须

  • python 如何实现跳过异常继续执行

    目录 python如何跳过异常继续执行 下面有两种解决方法 拓展资料 python错误之NameError 原因 解决办法 python如何跳过异常继续执行 下面有两种解决方法 第一种是类似if…else…:另外一种是使用语句来实现继续执行: 方法一:使用try…except…语句,类似于if…else…,可以跳过异常继续执行程序,这是Python的优势 用法如下: 方法二:使用语句来继续执行: 拓展资料 异常处理特点: 1.在应用程序遇到异常情况(如被零除情况或内存不足警告)时,就会产生异常.

  • 基于React路由跳转的几种方式

    目录 React路由跳转的几种方式 1. params形式 2. 使用state的形式 React路由跳转传参问题 使用Link传参 url传参 隐式传参 React路由跳转的几种方式 注意: 这里使用的react-router-dom是版本5以上,路由形式是history模式 react-router-dom文档,其中依赖包history的github地址 1. params形式 路由跳转后,参数会显示在地址栏 跳转的方法是使用 history.push({pathname: '/person

  • Java 常用类解析:java异常机制,异常栈,异常处理方式,异常链,异常丢失详解

    1.java标准异常概述 Throwable表示任何可以作为异常被抛出的类,有两个子类Error和Exception.从这两个类的源代码中可以看出,这两个类并没有添加新的方法,Throwable提供了所以方法的实现.Error表示编译时和系统错误.Exception是可以被抛出的异常类.RuntimeException继承自Exception(如NullPointerException),表示运行时异常,JVM会自动抛出. 2.自定义异常类 自定义异常类方法: 通过继承Throwable或Exc

随机推荐