Spring batch Spring批处理—如何在JdbcPagingItemReader未返回任何数据时完成作业

Spring batch Spring批处理—如何在JdbcPagingItemReader未返回任何数据时完成作业,spring-batch,Spring Batch,我的问题与此相反 JdbcPagingItemReader的行为似乎与该问题中描述的相反,即如果JdbcPagingItemReader未找到任何记录,则作业标记为失败 日志表明作业标记为失败,因为读卡器无法从wards上的第1页获取页面,并且选择失败,原因是SQLCODE=-313,即 -313指定的主机变量数不等于参数标记数 所以整个步骤被标记为失败,导致作业失败 对于wards上第1页的查询,排序键包含在选择中,如付款ID>?,我猜由于没有付款ID,占位符的值未找到,因此出现错误 在此特定

我的问题与此相反

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

日志表明作业标记为
失败
,因为读卡器无法从wards上的第1页获取页面,并且
选择
失败,原因是
SQLCODE=-313
,即

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

所以整个步骤被标记为失败,导致作业失败

对于wards上第1页的查询,排序键包含在
选择
中,如
付款ID>?
,我猜由于没有
付款ID
,占位符的值未找到,因此出现错误

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

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

if(stepExecution.getReadCount() == 0 ){
            return ExitStatus.COMPLETED;
        }
没有解决问题

块大小和读卡器页面大小都等于10&THROTTLE\u 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();
    }
PAYMENT\u ID
是我的排序键,节
和((PAYMENT\u ID>?)
已由spring batch添加

我的读者豆豆

@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;
    }

我不能肯定地回忆起来,但我想,我在下面的步骤和工作听众中做了

我基本上编写了一个
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
,在Overrided
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;
        }

条件,
stepExecution.getReadCount()==0
如果遇到这种情况,则仍然为真,但框架无法识别
步骤或
作业的侦听器设置或返回的
ExitStatus
集。我的意思是,框架在调试日志中转储的值是相同的-设置或返回不同值不会产生影响。比原来的。我是同一个问题,你能更新解决方案,如果你发现any@vsr:谢谢你的邀请。看看我的回答是否有用。我记得做过类似的事情,但不是100%确定。
@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;
        }
    @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;
        }