Spring Batch-当JdbcPagingItemReader没有返回数据时如何完成作业 [英] Spring Batch - how to COMPLETE a job when the JdbcPagingItemReader returns no data
本文介绍了Spring Batch-当JdbcPagingItemReader没有返回数据时如何完成作业的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我的问题与此existing SO question相反。
JdbcPagingItemReader
的行为似乎与该问题中描述的相反,即如果JdbcPagingItemReader
找不到任何记录,则将作业标记为FAILED
。
日志显示作业被标记为FAILED
,因为阅读器无法从病房的第1页获取页面,并且SELECT
由于SQLCODE=-313
(即
因此,整个步骤被标记为失败,从而导致作业失败。 对于从第1页开始的Ward查询,排序关键字包含在-313指定的主机变量数不等于参数标记数
SELECT
LikePAYMENT_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屋!
查看全文