Spring Batch-当JdbcPagingItemReader没有返回数据时如何完成作业 [英] Spring Batch - how to COMPLETE a job when the JdbcPagingItemReader returns no data

查看:34
本文介绍了Spring Batch-当JdbcPagingItemReader没有返回数据时如何完成作业的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的问题与此existing SO question相反。

JdbcPagingItemReader的行为似乎与该问题中描述的相反,即如果JdbcPagingItemReader找不到任何记录,则将作业标记为FAILED

日志显示作业被标记为FAILED,因为阅读器无法从病房的第1页获取页面,并且SELECT由于SQLCODE=-313(即

)而失败

-313指定的主机变量数不等于参数标记数

因此,整个步骤被标记为失败,从而导致作业失败。

对于从第1页开始的Ward查询,排序关键字包含在SELECTLikePAYMENT_ID > ?中,我猜因为没有PAYMENT_IDs,所以没有找到占位符的值,所以出错。

在此特定方案中,如何忽略此错误并将作业标记为COMPLETE

我尝试了Trever Shick在其他问题中的答案中指定的解决方案,并返回

if(stepExecution.getReadCount() == 0 ){
            return ExitStatus.COMPLETED;
        }

未修复该问题。

区块大小和读卡器页面大小均等于10&;throttle_Limit=20。

@Bean
    public Step step1(StepBuilderFactory stepBuilderFactory,
            ItemReader<RemittanceVO> syncReader, ItemWriter<RemittanceClaimVO> writer,
            ItemProcessor<RemittanceVO, RemittanceClaimVO> processor) {

        return stepBuilderFactory.get("step1")
                .<RemittanceVO, RemittanceClaimVO> chunk(Constants.SPRING_BATCH_CHUNK_SIZE)
                .reader(syncReader)
                .listener(afterReadListener)
                .processor(processor)
                .writer(writer)
                .taskExecutor(simpleAsyntaskExecutor)
                .throttleLimit(Constants.THROTTLE_LIMIT)
                .build();
    }

不是完整堆栈跟踪,而是日志中的一行

org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [SELECT PAYMENT_ID,INSURED_LAST_NM,INSURED_FIRST_NM,LAST_NM,FIRST_NM,CONTRACT_NUM,CARRIER_CD,CARRIER_GROUP,CONTRACT_NUM,REL_AR_SEQ_NUM,FROM_DOS_DT,THRU_DOS_DT,BILL_AMT,RX_NUM_BP,CERT_NUM_LEFT_BP,MODIFIER,PROC_CD ,DEPOSIT_ID,PRNT_CONTRACT_NUM,REMIT_TYPE_CD AS RMT_TYPE FROM AR.PAYMENTS WHERE (CONTRACT_NUM IN (SELECT CONTRACT_NUM FROM AR.PAYMENTS WHERE RMTST_RF='M' AND DELETE_IND='N' GROUP BY CONTRACT_NUM ) AND DELETE_IND='N' AND RMTST_RF='M') AND ((PAYMENT_ID > ?)) ORDER BY PAYMENT_ID ASC FETCH FIRST 50 ROWS ONLY]; nested exception is com.ibm.db2.jcc.am.SqlException: DB2 SQL Error: SQLCODE=-313, SQLSTATE=07004, SQLERRMC=null, DRIVER=4.11.77

PAYMENT_ID是我的排序关键字,第AND ((PAYMENT_ID > ?))节是按春批添加的。

我的阅读器Bean,

@Bean
    public ItemReader<RemittanceVO> syncReader() {
        SynchronizedItemStreamReader<RemittanceVO> syncReader = new SynchronizedItemStreamReader<RemittanceVO>();
        syncReader.setDelegate(reader());
        return syncReader;
    }

    @Bean
    public ItemStreamReader<RemittanceVO> reader() {
        JdbcPagingItemReader<RemittanceVO> reader = new JdbcPagingItemReader<RemittanceVO>();
        reader.setDataSource(dataSource);
        reader.setRowMapper(new RemittanceRowMapper());
        reader.setQueryProvider(queryProvider);
        reader.setPageSize(Constants.SPRING_BATCH_READER_PAGE_SIZE);
        return reader;
    }

查询提供程序Bean,

@Bean
    public PagingQueryProvider queryProvider() throws Exception{
        SqlPagingQueryProviderFactoryBean queryProviderBean= new SqlPagingQueryProviderFactoryBean();
        queryProviderBean.setDataSource(dataSource);
        queryProviderBean.setDatabaseType("DB2");
        queryProviderBean.setSelectClause(Constants.REMITTANCES_SELECT_CLAUSE);
        queryProviderBean.setFromClause(Constants.REMITTANCES_FROM_CLAUSE);
        queryProviderBean.setWhereClause(Constants.REMITTANCES_WHERE_CLAUSE);
        queryProviderBean.setSortKey(Constants.REMITTANCES_SORT_KEY);
        PagingQueryProvider queryProvider = queryProviderBean.getObject();
        return queryProvider;
    }   

推荐答案

我不能肯定地回忆起来,但我想,我在下面的步骤&;作业侦听器中回忆了。

我基本上写了一个StepExecutionListener并覆盖了afterStep方法,如下所示

@Override
        public ExitStatus afterStep(StepExecution stepExecution) {
        if (stepExecution.getReadCount() == 0) {
            logger.info(
                "!!! Step is marked as FAILED because no rows OR no valid rows  were read by reader of this step !");
            ExitStatus newExitStatus = ExitStatus.COMPLETED;
            stepExecution.setExitStatus(newExitStatus);
            return newExitStatus;
        }
        return null;
        }

还编写了职级监听器-JobExecutionListenerSupport,将类似的内容放在覆盖的afterJob方法中,

    @Override
    public void afterJob(JobExecution jobExecution) {
        .......
        .......
        .......
        .......    
        boolean zeroRead = true;
        for (StepExecution stepExecution : stepExecutions) {
        if (stepExecution.getReadCount() != 0) {
            zeroRead = false;
        }
        }
        if (zeroRead) {
        logger.info("***** JOB is FAILED because read count is Zero *****");
        jobExecution.setExitStatus(ExitStatus.COMPLETED);
        return;
        }

这篇关于Spring Batch-当JdbcPagingItemReader没有返回数据时如何完成作业的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆