Пакет Spring jpagingitemreader размер страницы и максимальное количество элементов

#spring #spring-batch #batch-processing

#весна #весенний пакет #пакетная обработка

Вопрос:

Я использую JpaPagingItemReader с пакетным заданием Spring для чтения данных из базы данных. У меня есть требование, согласно которому я могу записывать только 10 тыс. записей на внешний сервер при каждой попытке. Я установил размер блока и размер страницы равными 10000. Поможет ли это читать, обрабатывать и записывать только 10 тыс. записей при каждой попытке, пока JpaPagingItemReader не будет исчерпан с ответом null и все данные из БД будут прочитаны? Я запутался между значениями Pagesize и setMaxItemCount. Какой метод обеспечит чтение 10 тыс. записей из базы данных?

Этап пакетной настройки:

     public Step step1(StepBuilderFactory stepBuilderFactory, @Qualifier("itemReader") ItemReader<BatchRecords> ir,
            @Qualifier("itemProcessor") ItemProcessor<BatchRecords, Map<String, Object>> ip,
            @Qualifier("itemWriter") ItemWriter<Map<String, Object>> iw) throws Exception {
        logger.info("Step1");
        return stepBuilderFactory.get("step1").<BatchRecords, Map<String, Object>>chunk(10000).reader(ir).processor(ip)
                .writer(iw).build();

    }



ItemReader:

    @Bean(destroyMethod="")
    @StepScope
    public JpaPagingItemReader<BatchRecords> itemReader(){
        Map<String, Object> dates = batchUtil.dateFormat();
        String startDate = (String) dates.get("StartDate");
        String endDate = (String) dates.get("EndDate");
        logger.info("Batch settlement Start date : {}, End Date: {}",startDate,endDate);
        JpaPagingItemReader<BatchRecords> reader = new JpaPagingItemReader<BatchRecords>();
        reader.setEntityManagerFactory(localContainerdbEntityManagerFactory.getNativeEntityManagerFactory());
        reader.setQueryString("select b from BatchRecords b where b.status = 'O' and b.ordTimestamp between '"   startDate   "' and '"   endDate  "' ");

        reader.setPageSize(10000);
//      reader.setMaxItemCount(50*reader.getPageSize());
        try {
            reader.afterPropertiesSet();
        } catch (Exception e) {
            logger.error("Exception in paging Item reader: " e.getMessage());
        }
        return reader;

    }```
 

Ответ №1:

Вам нужно использовать maxItemCount , если вы хотите ограничить общее количество элементов для чтения. Я думаю, что еще лучше установить ограничение в вашем SQL-запросе. PageSize сообщит читателю, сколько элементов для чтения на каждой странице (это не ограничение на общее количество элементов, а ограничение на количество элементов для чтения при запросе новой страницы).

Комментарии:

1. Атрибут maxItemCount ненадежен на многопоточном этапе Spring Batch. Похоже, что он извлекает больше данных, чем запрошенный maxItemCount.