java - 如何知道它是否是 SpringBatch 的 ItemProcessor 中的最后一项
问题描述
我有以下 ItemProcessor,我需要知道该项目是否是阅读器发送的最后一个项目。这可能吗?
流程是:
ItemReader
- 从数据库中读取行(预计数百万行)ItemProcessor
- 对每一行执行一些验证,发送到 webservice 并使用 webservice 响应执行更多验证。ItemWriter
- 从验证中写入数据库错误,并更改线路状态。
另一种可能的解决方案是 ItemReader 发送Line
带有大小的列表NUMBER_OF_LINES_TO_CALL_WEBSERVICE
,但我找不到有关如何修改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 服务。
您可以使用块大小为 100 的面向块的步骤。该步骤将为您进行缓冲,并且您可以访问项目列表的过程中的第一个点位于ItemWriteListener#beforeWrite(List items)
. 因此,您可以使用该侦听器来执行 Web 服务调用,也可以自己执行(如果这是您需要执行ItemWriter
的唯一操作)。write
一旦你有了项目列表,你就可以对它做任何你想做的事情(即检查最后一个项目,过滤前 99 个项目并将它们发送到 Web 服务等)。
推荐阅读
- virtual-reality - 是否可以使用 openvr 为 HMD 中的显示添加失真?
- c# - ASP .NET Core:如何缓存依赖于用户输入的数据?
- jquery - kendo ui jquery工具栏按钮徽章不起作用
- c++ - 按其子元素之一对 QJsonArray 进行排序
- computer-vision - RetinaNet 中的焦点损失
- mongodb - 如何在 MongoDB 中将集合导出到 TSV
- axis2 - 无法使用 jibx 解析解组 xsi:nil=true
- github - 如何使用 ssh_rsa 密钥对创建从 jupyter notebook 到 github 的永久登录
- mysql - 按两个表分组,然后附加结果并删除重复项
- ruby - Ruby `uniq` 方法用于相等性检查是什么?