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
,在OverridedafterJob
方法中添加类似的内容
@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;
}