【发布时间】:2021-05-25 16:27:08
【问题描述】:
我有以下 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();
}
【问题讨论】:
-
你为什么需要它?您能在不参考 Spring Batch 的情况下描述您想要实现的目标吗?您的步骤/工作的输入/输出是什么?有一种方法可以做到这一点,但这取决于这些问题的答案。
-
我想将 100 个元素的列表中的行分组以发送到 Web 服务,当最后一项发送到处理器时,剩余的行将发送到 Web 服务。
标签: java spring spring-batch itemprocessor