私は次の ItemProcessor を持っています。アイテムがリーダーが送信した最後のアイテムであるかどうかを知る必要があります。これは可能ですか?
フローは次のとおりです。
ItemReader
- データベースから行を読み取ります (数百万行が予想されます)ItemProcessor
- 各行でいくつかの検証を実行し、webservice に送信し、webservice 応答でさらに検証を実行します。ItemWriter
- 検証からデータベース エラーを書き込み、ライン ステータスを変更します。
別の可能な解決策は、 ItemReader がLine
sizeのリストを送信する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();
}