Невозможно получить все записи на основе разных pageSize и ChunkSize при использовании JpaPagingItemReader

Мне нужно ограничить 14 записей. chunkSize составляет 10 страниц. Размер равен 2. Он охватывает только 10 записей.

Проверял разными способами. chunkSize = 5 pageSize = 10 По-прежнему ограничены только 10 записей, а не все 14.

он отлично работает, только если chunksize = 11 и pageSize = 10 или chunkSize = 10 и pageSize = 20

 build.gradle

  partition:
    defaultPartitionSize: 5
    partitionScopeChunkSize: 10
  jobs:
    jpaPagingSize: 2
  ===================ReaderClass============================ 
  public class PagingItemReader extends 
  JpaPagingItemReader<ScopeParams> {

     public PagingItemReader (
                              EntityManager entityManager,
                              EntityManagerFactory entityManagerFactory,
                              @Value("${spring.jobs.jpaPagingSize}") int jpaPagingSize)
        Map<String, Object> parameterValues = new HashMap<>();
        this.setQueryProvider(
                 ScopeParamsQueryProvider.buildForContinuousMatchScoping(
                      entityManager, 
                      IndustryCodes.valueFromCode(industryCd)));
        this.setEntityManagerFactory(entityManagerFactory);
        this.setPageSize(jpaPagingSize);
        this.setSaveState(true);
        this.setParameterValues(parameterValues);

  }
}

 ==============WriterClass==========
 public class JpaItemWriter<T> extends JpaItemWriter<T> {
   private JpaRepository<T, ? extends Serializable> repository;

   public JpaItemWriter(JpaRepository<T, ?> repository) {
    this.repository = repository;
    }

  @Override
  @Transactional
  public void write(List<? extends T> items) {
    persistEntities(items);
  }

  private void persistEntities(List<? extends T> list) {
    list.stream()
            .peek(item -> log.info("Writing={}", item))
            .forEach(repository::save);
  }

}

 ===================Step Configuration========
public Step WorkStep(StepBuilderFactory stepBuilderFactory,
              PagingItemReader ItemReader,
              ItemProcessor ItemProcessor,
              JpaItemWriter<Scope> itemWriter) {
    return stepBuilderFactory.get(WORK_MATCH)
            .<Scope, ExecutionScope>chunk(10)
            .reader(ItemReader)
            .processor(ItemProcessor)
            .writer(itemWriter)
            .build();
}

код процессора,

public class MatchItemProcessor implements ItemProcessor<Scope,ExecutionScope> { 

public ExecutionScope process(Scope financialTransaction) throws Exception { 
return batchExecutionScope; 
} 
} 

private ExecutionScope prepareData(Scope transaction) { ExecutionScope executionScope = new ExecutionScope(); executionScope .setIndustryTypeCode(financialTransaction.getIndustryTypeCode()); return executionScope ; }

Я обновляю другой объект в процессоре с теми же полями, в которых происходит чтение. Итак, я читаю объект «Область» в классе читателя. В классе процессора создание объекта execitionScope и обновление значений на основе области действия и сохранение execitionScope в БД.

Обе сущности указывают на разные таблицы. ScopeParam нажмите на таблицу fin_t и ExecutionScope нажмите на таблицу exec_scope.

пожалуйста, предоставьте мне предложение.


person user84    schedule 25.10.2018    source источник
comment
скорее всего, вы обновляете объекты чтения в процессоре для тех же полей, в которых происходит чтение. Покажите пример запроса и код процессора.   -  person Sabir Khan    schedule 25.10.2018
comment
открытый класс FinancialTransactionItemProcessor реализует ItemProcessor‹ScopeParams, BatchExecutionScope› { открытый процесс BatchExecutionScope (ScopeParams FinancialTransaction) выдает исключение { BatchExecutionScope batchExecutionScope = null; if (null!= FinancialTransaction) batchExecutionScope = prepareData(financialTransaction); } вернуть batchExecutionScope; } }   -  person user84    schedule 25.10.2018
comment
private BatchExecutionScope prepareData(ScopeParams FinancialTransaction) { BatchExecutionScope batchExecutionScope = new BatchExecutionScope(); batchExecutionScope.setIndustryTypeCode(financialTransaction.getIndustryTypeCode()); вернуть пакетную область выполнения; }   -  person user84    schedule 25.10.2018
comment
Я обновляю другой объект в процессоре с теми же полями, в которых происходит чтение. Итак, я читаю объект ScopeParam в классе читателя. В классе процессора создание объекта batchExecitionScope и обновление значений на основе scopeParam и сохранение batchExecitionScope в БД.   -  person user84    schedule 25.10.2018
comment
Я переместил ваши комментарии в вопрос. Я спрашиваю, обновляете ли вы данные в БД, предназначенные для чтения? Несмотря на то, что сущности разные, указывают ли они на одну и ту же таблицу в БД?   -  person Sabir Khan    schedule 25.10.2018
comment
Спасибо Сабир за ответ. Нет, оба указывают на разные таблицы. ScopeParam попал в таблицу fin_t, а BatchExecutionScope попал в таблицу Batch_exec_scope.   -  person user84    schedule 25.10.2018
comment
Тогда это очень странная проблема.   -  person Sabir Khan    schedule 25.10.2018
comment
Ok. Последнее, извините, что беспокою. как мне узнать, сколько страниц создано внутри jpaPageItemreader? Потому что, если я увеличу размер фрагмента 14 и размер страницы = 2. Я получаю все 14 записей в классе процессора, но если chuckSize = 10 и pageSize = 2. только 10 записей печатаются на процессорном классе. остальные 4 записи пропущены на уровне чтения.   -  person user84    schedule 25.10.2018
comment
Насколько мне известно, средства чтения страниц Spring Batch (JDBC или JPA) не реализуют разбиение на страницы таким образом, т.е. они не подсчитывают количество страниц заранее. JPA использует предложения ÒFFSET и LIMIT и отслеживает общее количество прочитанных элементов в любой момент времени. Общее количество прочитанных элементов делится на размер страницы, чтобы узнать текущий номер страницы. Поэтому, если вы продолжаете добавлять записи в таблицу после запуска задания, ваше задание будет продолжать выполняться и для новых элементов, добавленных после запуска задания.   -  person Sabir Khan    schedule 25.10.2018
comment
Спасибо, Сабир. Это разрешилось. Мой запрос не возвращал записи на основе размера страницы. я изменил свой запрос, и он работает нормально. :)   -  person user84    schedule 26.10.2018
comment
Можете ли вы добавить ответ, чтобы сказать, что он решен и как он был решен? Спасибо.   -  person Mahmoud Ben Hassine    schedule 26.10.2018
comment
Спасибо за добавление ответа!   -  person Mahmoud Ben Hassine    schedule 29.10.2018


Ответы (1)


Проблема решена. Мне помогла эта ссылка. Spring batch jpaPagingItemReader, почему некоторые строки не читаются?

  • Актуальная проблема

    JPAPagingItemReader использует смещения и ограничения, и если ваши выходные данные запроса области видимости будут изменены как часть вашей записи/разбиения на фрагменты, то на следующей странице уже будет измененный набор данных, а смещение будет продолжать пропускать необработанные данные. Поскольку наш запрос области видимости игнорирует транзакции, уже включенные в область действия любого активного пакета, как только первый выгружаемый набор отбрасывается, они подпадают под упущение.

  • Решение Изменил мой запрос области действия и игнорировал текущее выполняющееся задание.

person user84    schedule 26.10.2018