Невозможно получить все записи на основе различных pageSize и ChunkSize при использовании JpaPagingItemReader
Мне нужно охватить 14 записей. Размер блока составляет 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 FinancialTransactionPagingItemReader extends
JpaPagingItemReader<ScopeParams> {
public FinancialTransactionPagingItemReader(
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 RepositoryListJpaItemWriter<T> extends JpaItemWriter<T> {
private JpaRepository<T, ? extends Serializable> repository;
public RepositoryListJpaItemWriter(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 findScopeOfWorkStep(StepBuilderFactory stepBuilderFactory,
FinancialTransactionPagingItemReader financialTransactionItemReader,
FinancialTransactionItemProcessor financialMatchItemProcessor,
RepositoryListJpaItemWriter<BatchExecutionScope> financialMatchItemWriter) {
return stepBuilderFactory.get(STEP3_SCOPE_OF_WORK_MATCH)
.<ScopeParams, BatchExecutionScope>chunk(10)
.reader(financialTransactionItemReader)
.processor(financialMatchItemProcessor)
.writer(financialMatchItemWriter)
.build();
}
Код процессора,
public class FinancialTransactionItemProcessor implements ItemProcessor<ScopeParams, BatchExecutionScope> {
public BatchExecutionScope process(ScopeParams financialTransaction) throws Exception {
BatchExecutionScope batchExecutionScope = null;
if (null != financialTransaction) batchExecutionScope = prepareData(financialTransaction); } return batchExecutionScope;
}
}
private BatchExecutionScope prepareData(ScopeParams financialTransaction) { BatchExecutionScope batchExecutionScope = new BatchExecutionScope(); batchExecutionScope.setIndustryTypeCode(financialTransaction.getIndustryTypeCode()); return batchExecutionScope; }
Я обновляю другой объект в процессоре с теми же полями, на которых происходит чтение. Поэтому я читаю сущность "ScopeParam" в классе читателей. В классе процессора создание объекта batchExecitionScope и обновление значений на основе scopeParam и сохранение batchExecitionScope в БД.
Обе сущности указывают на разные таблицы. ScopeParam
нажмите на таблицу fin_t и BatchExecutionScope
нажмите таблицу Batch_exec_scope.
пожалуйста, предоставьте мне предложение.
1 ответ
Проблема была решена. Я получил помощь по этой ссылке. Spring batch jpaPagingItemReader, почему некоторые строки не читаются?
Актуальная проблема
JPAPagingItemReader использует смещения и ограничения, и если выходные данные вашего предварительного запроса изменяются как часть вашей записи / разбиения на фрагменты, то на следующей странице уже будет измененный набор данных, и смещение будет пропускать необработанные данные. Так как наш запрос области действия игнорирует транзакции, уже ограниченные как часть любого активного пакета, как только будет проверен первый выгружаемый набор, они попадают под пропуск.
Решение Модифицировал мой предварительный запрос и игнорировал текущее текущее задание.