如何知道它是否是Spring Batch的ItemProcessor中的最后一项
How to know if it is the last item in ItemProcessor of SpringBatch
我有以下 ItemProcessor,我需要知道该项目是否是 reader 发送的最后一个项目。这可能吗?
流量为:
ItemReader
- 从数据库中读取行(预计数百万行)
ItemProcessor
- 在每一行上执行一些验证,发送到 webservice 并使用 webservice 响应执行更多验证。
ItemWriter
- 写入数据库验证错误,并更改行状态。
另一种可能的解决方案是 ItemReader 发送 Line
的列表,大小为 NUMBER_OF_LINES_TO_CALL_WEBSERVICE
,但我找不到关于如何修改 JpaPagingItemReader
.[=19 的示例=]
@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();
}
}
reader 是 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();
}
I want to group lines in a list of 100 elements to send to a webservice, and when the last item is sent to processor the remaining lines are sent to the webservice.
您可以使用块大小为 100 的面向块的步骤。该步骤将为您进行缓冲,您可以访问项目列表的过程中的第一个点在 ItemWriteListener#beforeWrite(List items)
。因此,您可以使用该侦听器来执行 Web 服务调用,或者在 ItemWriter
本身中执行(如果这是您需要执行的唯一 write
操作)。
一旦你有了项目列表,你就可以用它做任何你想做的事(即检查最后一个项目,过滤前 99 个项目并将它们发送 post 到网络服务,等等)。
我有以下 ItemProcessor,我需要知道该项目是否是 reader 发送的最后一个项目。这可能吗?
流量为:
ItemReader
- 从数据库中读取行(预计数百万行)ItemProcessor
- 在每一行上执行一些验证,发送到 webservice 并使用 webservice 响应执行更多验证。ItemWriter
- 写入数据库验证错误,并更改行状态。
另一种可能的解决方案是 ItemReader 发送 Line
的列表,大小为 NUMBER_OF_LINES_TO_CALL_WEBSERVICE
,但我找不到关于如何修改 JpaPagingItemReader
.[=19 的示例=]
@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();
}
}
reader 是 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();
}
I want to group lines in a list of 100 elements to send to a webservice, and when the last item is sent to processor the remaining lines are sent to the webservice.
您可以使用块大小为 100 的面向块的步骤。该步骤将为您进行缓冲,您可以访问项目列表的过程中的第一个点在 ItemWriteListener#beforeWrite(List items)
。因此,您可以使用该侦听器来执行 Web 服务调用,或者在 ItemWriter
本身中执行(如果这是您需要执行的唯一 write
操作)。
一旦你有了项目列表,你就可以用它做任何你想做的事(即检查最后一个项目,过滤前 99 个项目并将它们发送 post 到网络服务,等等)。