[英]Spring Batch SkipPolicy stuck in infinite loop when handling exception
Spring batch job that is using a custom skip policy to handle an Exception that is getting thrown after all records are loaded to the database. Spring 批处理作业使用自定义跳过策略来处理在所有记录加载到数据库后引发的异常。 My step looks like...
我的步骤看起来像...
@Bean
public Step trialBalanceLoadStep(JdbcBatchItemWriter<TrialBalance> trialBalanceWriter) throws ParseException {
return stepBuilderFactory.get("trialBalanceLoadStep")
.<TrialBalance, TrialBalance> chunk(1000)
.reader(trialBalanceReader())
.writer(trialBalanceWriter)
.faultTolerant()
.skipPolicy(new CustomSkipPolicy())
.build();
}
My CustomSkipPolicy class is...我的 CustomSkipPolicy 类是...
public class CustomSkipPolicy implements SkipPolicy {
@Override
public boolean shouldSkip(Throwable throwable, int i) {
if (throwable instanceof Exception) {
return true;
}
return false;
}
}
I'm handling Exception just for testing purposes.我处理 Exception 只是为了测试目的。 But what I've been seeing is org.springframework.dao.DuplicateKeyException being thrown.
但我一直看到的是 org.springframework.dao.DuplicateKeyException 被抛出。
There are NO DUPLICATES in this file.此文件中没有重复项。 Please do not ask.
请不要问。 There isn't.
没有。 I've deduped the entire file.
我已经对整个文件进行了重复数据删除。 They do not exist.
它们不存在。 In fact, the entire record count is being loaded to the db.
事实上,整个记录计数正在加载到数据库中。 Even after this job fails, if I run a count on the table i get the entire record count of the file.
即使在这项工作失败后,如果我对表进行计数,我也会得到文件的整个记录计数。 So this exception is being thrown AFTER all the records are loaded.
因此,在加载所有记录后会抛出此异常。
This ONLY HAPPENS when an particular index exists on this table.这仅在此表上存在特定索引时发生。 The index was created because we have a real time process querying this table and the query run time is significantly faster with the index.
创建索引是因为我们有一个实时进程查询该表,并且使用索引显着加快了查询运行时间。 So we'd like to keep the index.
所以我们想保留索引。 But again, the index (which may or may not be causing the issue) is making the exception be thrown and now our batch load jobs won't run.
但同样,索引(可能会也可能不会导致问题)正在引发异常,现在我们的批处理加载作业将无法运行。
So I'm trying to handle this exception being thrown, by creating this CustomSkipPolicy class but it's staying in an infinite loop when I do this (if I put a println before my return statement it will just keep pumping that out)所以我试图通过创建这个 CustomSkipPolicy 类来处理抛出的这个异常,但是当我这样做时它处于无限循环中(如果我在 return 语句之前放置一个 println 它只会继续输出它)
EDIT Adding in the schema and trialBalanceWriter编辑添加架构和 trialBalanceWriter
When I run a describe...当我运行描述...
Name Null? Type
------------------------------ -------- ------------
BAT_PROC_DT NOT NULL DATE
ETL_TS TIMESTAMP(6)
PROC_APPL_CD VARCHAR2(3)
FIRM_BNK_ID NOT NULL VARCHAR2(4)
ACCT_NB NOT NULL VARCHAR2(15)
ACCT_TYPE_CD VARCHAR2(2)
CUST_ACCT_OWNR_SHRT_NM VARCHAR2(20)
ACCT_CURR_BAL_AM NUMBER(15,2)
ACCT_PROD_GP_CD VARCHAR2(3)
SO_SCRTY_NB_ID NUMBER(9)
ACCT_BR_ID NUMBER(7)
ACCT_OPN_DT DATE
CHK_OR_SV_LFCYC_STS_CD VARCHAR2(2)
ACC_ROLL_12MO_OD_INSTN_CN NUMBER(3)
CHK_OR_SVACC_RCNCL_TXN_TYPE_CD VARCHAR2(1)
ACC_SRVC_FEE_BILL_SYS_CD CHAR(1)
CHK_OR_SVACC_LOB_CD VARCHAR2(3)
CHK_OR_SVACC_LOB_OWNR_CD VARCHAR2(2)
CHK_ACCT_PSTV_PAY_IN CHAR(1)
CHK_OR_SVACC_OD_TXN_PYMT_CD CHAR(1)
ACC_LAST_DAY_TOT_DEP_AM NUMBER(13)
PRNT_ACCT_NB NUMBER(15)
CARD_ACCT_NB NUMBER(17)
CHK_OR_SVACC_OD_AM NUMBER(11)
ACC_MO_TO_DT_OD_INSTN_DAY_CN NUMBER(3)
CHK_OR_SVACC_OD_PRTC_CD CHAR(1)
CHK_OR_SVACC_OD_LAST_2PRTC_CD CHAR(1)
CHK_OR_SVACC_OD_LAST_3PRTC_CD CHAR(1)
CHK_OR_SVACC_LAST_MNTR_ACTV_DT DATE
CHK_OR_SVACC_LAST_DEP_DT DATE
CHK_OR_SVACC_MOST_RCNT_OD_DT DATE
STOP_PYMT_CD CHAR(1)
CNTPR_TYPE_CD VARCHAR2(2)
RISK_AVD_CD CHAR(1)
RET_MAIL_STS_CD CHAR(1)
AUTM_CLR_HS_IN CHAR(1)
FED_TAX_WHLD_CD VARCHAR2(2)
LAST_OD_DSPN_CD NUMBER(1)
ACC_CAL_MO_TO_DT_ALB_AM NUMBER(15,2)
ACC_MO_TO_DT_OD_INSTN_CN NUMBER(3)
ACCT_MO_TO_DT_RET_ITEM_CN NUMBER(3)
ACCT_MO_TO_DT_NSF_ITEM_CN NUMBER(3)
ACCT_CTL_DISB_CD CHAR(1)
ACC_ROLL_12MO_AVG_COLL_BAL_AM NUMBER(13)
ACC_ROLL_12MO_OD_INSTN_DAY_CN NUMBER(3)
ACCT_ROLL_12MO_NSF_ITEM_CN NUMBER(3)
ACC_12MO_NSF_PTNL_RET_ITEM_CN NUMBER(5)
ACCT_ROLL_12MO_RET_ITEM_CN NUMBER(3)
CHK_OR_SVACC_OPN_DT DATE
ACC_OD_PRTC_AVAL_FUND_AM NUMBER(15,2)
DBCD_LAST_CHRG_DT DATE
CHK_OR_SVACC_PRC_RGN_NB NUMBER(5)
DEP_ACCT_FUND_PRPS_CD CHAR(1)
CHK_OR_SVACC_OD_PRTC_PROD_CD NUMBER(1)
UNVS_PROD_CAT_CD VARCHAR2(4)
SGNTR_RVW_THLD_AM NUMBER(9)
TXN_MIN_SGNTR_CN NUMBER(1)
ACH_DEP_LTST_DT DATE
TELR_BLK_TXN_TYPE_CD CHAR(1)
PRVT_BNK_REL_CD CHAR(1)
CHK_OR_SV_AVAL_BAL_AM NUMBER(15,2)
CHK_OR_SVACC_COLL_BAL_AM NUMBER(15,2)
DDA_PNDG_HARD_HOLD_AM NUMBER(15,2)
RCNT_CYC_CR_AM NUMBER(15,2)
RCNT_CYC_DR_AM NUMBER(15,2)
ACCT_PRPS_CD VARCHAR2(2)
PYMT_FUND_SRC_CD VARCHAR2(2)
CHK_ACCT_CHK_ENCST_CD CHAR(1)
ACCT_ROLL_12MO_ALB_AM NUMBER(13)
ACCT_ACTV_CD CHAR(1)
OV_DRFT_PRTC_ACCT_NB NUMBER(15)
OV_DRFT_PRTC_ACCT_LNK_DT DATE
ACCT_CLSE_DT DATE
STOP_NOTE_IN CHAR(1)
RCNT_CYC_CR_ITEM_CN NUMBER(7)
RCNT_CYC_DR_ITEM_CN NUMBER(7)
ADDL_WDRW_FEE_WVE_IN CHAR(1)
ACCT_CLSE_SPRS_CD CHAR(1)
ACCT_RCNT_ACTV_DT DATE
GL_CC_NB NUMBER(7)
ACCT_LAST_CNTC_DT DATE
CHK_OR_SVACC_OD_DAY_CN NUMBER(3)
UNVS_PROD_FAM_CD VARCHAR2(4)
trialBalanceWriter is as follows... trialBalanceWriter 如下...
@Bean
public JdbcBatchItemWriter<TrialBalance> trialBalanceWriter(final DataSource dataSource) {
return new JdbcBatchItemWriterBuilder<TrialBalance>()
.itemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>())
.sql(Constants.trialBalanceInsertStatement)
.assertUpdates(false)
.dataSource(dataSource)
.build();
}
there is something wrong with the primary key column, either NULLs are contained or its values (of the pk column, not the record itself) are not unique.主键列有问题,要么包含 NULL,要么它的值(pk 列,而不是记录本身)不是唯一的。
The reason why it is thrown after all records have been added is most likely because the transaction is committed at this point.之所以在所有记录都添加完后抛出它,很可能是因为此时提交了事务。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.