简体   繁体   English

Spring Batch SkipPolicy 处理异常时陷入无限循环

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM