0

私は次の ItemProcessor を持っています。アイテムがリーダーが送信した最後のアイテムであるかどうかを知る必要があります。これは可能ですか?

フローは次のとおりです。

  • ItemReader- データベースから行を読み取ります (数百万行が予想されます)
  • ItemProcessor- 各行でいくつかの検証を実行し、webservice に送信し、webservice 応答でさらに検証を実行します。
  • ItemWriter- 検証からデータベース エラーを書き込み、ライン ステータスを変更します。

別の可能な解決策は、 ItemReader がLinesizeのリストを送信する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();
    }
4

1 に答える 1