如何知道它是否是SpringBatch的ItemProcessor中的最后一个项目



我有下面的ItemProcessor,我需要知道该项目是否是读取器发送的最后一个项目。这可能吗?

流程为:

  • ItemReader-从数据库读取行数(预计为数百万行(
  • ItemProcessor-对每一行执行一些验证,发送到webservice,并使用webservice响应执行更多验证
  • ItemWriter-写入验证中的数据库错误,并更改行状态

另一个可能的解决方案是ItemReader发送一个大小为NUMBER_OF_LINES_TO_CALL_WEBSERVICELine列表,但我找不到如何修改JpaPagingItemReader的示例。


@Override
public List<Line> process(Line line) {

lineList.add(line);
if (lineList.size() == NUMBER_OF_LINES_TO_CALL_WEBSERVICE) {
callWs(lineList);

return lineList;    // goes to ItemWriter to write the response from ws in database 
}

if( /* TODO if last line */) {      

callWs(lineList);
return lineList;
}

return null;
}

private void callWs(List<Line> lineList){
...
//Get response from webservice and add info to lines
}
@Override
public void afterChunk(ChunkContext chunkContext) {
if (lineList.size() == NUMBER_OF_LINES_TO_CALL_WEBSERVICE) {
lineList.clear();
}
}

阅读器是JpaPagingItemReader:


@Bean
@StepScope
public JpaPagingItemReader<Line> itemReader(@Qualifier("EntityManagerFactory") EntityManagerFactory entityManagerFactory) {

String queryStr = "select l from Line l" ;
return new JpaPagingItemReaderBuilder<Linha>()
.name("lineReader")
.entityManagerFactory(entityManagerFactory)
.queryString(queryStr)
.pageSize(PAGE_SIZE)
.build();
}

我想将100个元素列表中的行分组,以发送到Web服务,当最后一个项目发送到处理器时,其余行发送到Web Service。

您可以使用块大小为100的面向块的步骤。该步骤将为您进行缓冲,并且您可以访问项目列表的过程中的第一个点位于ItemWriteListener#beforeWrite(List items)中。因此,您可以使用该侦听器执行web服务调用,也可以在ItemWriter本身中执行(如果这是唯一需要执行的write操作(。

一旦你有了项目列表,你就可以用它做任何你想做的事情(即检查最后一个项目,过滤前99个项目,并将它们发送到web服务,等等(。

最新更新