SpringBatch跳過異常和限制方式
SpringBatch容錯(cuò)處理
1. 案例說明
從DB中reader出1000條數(shù)據(jù),chunk = 100,當(dāng)?shù)诙€(gè)chunk出現(xiàn)NullPointerException或者StringIndexOutOfBoundsException異常。業(yè)務(wù)要求batch不終了,程序繼續(xù)執(zhí)行。
2. 跳過異常限制
下記有兩種實(shí)現(xiàn)方法。
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方法限制最大跳過數(shù),skip方法限制跳過的異常類型。
這樣某條數(shù)據(jù)出現(xiàn)異常時(shí),并不會(huì)終了step,而是跳過本條錯(cuò)誤數(shù)據(jù),繼續(xù)處理下一條。
2.2 自定義跳過配置SkipPolicy 接口
SkipPolicy相對于skip更加靈活。
例:業(yè)務(wù)要求,userId = 110的用戶出現(xiàn)上記兩個(gè)異常時(shí),程序終了。
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 錯(cuò)誤積累
1.如果nextStep在該JOB中還沒有配置
也就是說nextStep還不存在的情況下,就會(huì)報(bào)錯(cuò)
<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
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
JAVA內(nèi)存模型和Happens-Before規(guī)則知識點(diǎn)講解
在本篇文章里小編給大家整理的是一篇關(guān)于JAVA內(nèi)存模型和Happens-Before規(guī)則知識點(diǎn)內(nèi)容,有需要的朋友們跟著學(xué)習(xí)下。2020-11-11
Mybatis plus關(guān)閉駝峰命名的四種方法(防止出現(xiàn)查詢?yōu)镹ull)
這篇文章主要介紹了Mybatis plus關(guān)閉駝峰命名的四種方法(防止出現(xiàn)查詢?yōu)镹ull),數(shù)據(jù)庫的字段命名方式為使用下劃線連接,對應(yīng)的實(shí)體類應(yīng)該是駝峰命名方式,而我使用的是和數(shù)據(jù)庫同樣的命名方式,需要的朋友可以參考下2022-01-01
簡述JAVA中堆內(nèi)存與棧內(nèi)存的區(qū)別
這篇文章主要介紹了JAVA中堆內(nèi)存與棧內(nèi)存的區(qū)別,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07
一文教會(huì)Java新手使用Spring?MVC中的查詢字符串和查詢參數(shù)
在使用springMVC框架構(gòu)建web應(yīng)用,客戶端常會(huì)請求字符串、整型、json等格式的數(shù)據(jù),這篇文章主要給大家介紹了關(guān)于通過一文教會(huì)Java新手使用Spring?MVC中的查詢字符串和查詢參數(shù)的相關(guān)資料,需要的朋友可以參考下2024-01-01
看過就懂的java零拷貝及實(shí)現(xiàn)方式詳解
這篇文章主要為大家詳細(xì)的介紹了什么是零拷貝,傳統(tǒng)的IO執(zhí)行流程,零拷貝相關(guān)的知識點(diǎn)回顧,零拷貝實(shí)現(xiàn)的幾種方式及java提供的零拷貝方式相關(guān)內(nèi)容,有需要的朋友可以借鑒參考下2022-01-01
Java動(dòng)態(tài)代理分析及簡單實(shí)例
這篇文章主要介紹了 Java動(dòng)態(tài)代理分析及簡單實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-02-02

