Вопрос: Я столкнулся с проблемой в проекте Spring Batch. Я пытаюсь читать, обрабатывать и обновлять объекты на основе их обработанного флага в базе данных. Вот описание моей настройки и проблемы:
До: База данных содержит 300 записей, если обработано значение «False» — ее следует рассматривать для обработки в пакетное задание.
введите здесь описание изображения
Ожидается: после запуска пакетного задания все необработанные записи (processed = "False") должно быть прочитано, а сумма должна быть увеличена на 1 и записана обратно в БД с обработанным = "true
Описание проблемы:
Я настроил Пакетное задание Spring для чтения, обработки и обновления сущностей BankTransaction. Цель состоит в том, чтобы обработать только те транзакции, которые не были обработаны (обработано = false), добавить 1 доллар к их сумме, пометить их как обработанные (обработано = true) и сохранить. их обратно в базу данных.
Текущее поведение:
Задание считывает 10 элементов, обрабатывает их, обновляет их флаг обработки до значения true и сохраняет их. Однако во время последующей операции чтения программа чтения пропускает следующие 10 элементов и продолжает этот шаблон.
введите здесь описание изображения
Вот мое. код:
Класс чтения
Код: Выделить всё
package com.dev.springbatch.batch;
import com.dev.springbatch.entity.BankTransaction;
import jakarta.persistence.EntityManagerFactory;
import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.database.JpaPagingItemReader;
import org.springframework.batch.item.database.builder.JpaPagingItemReaderBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class BankTransactionsItemReader implements ItemReader {
private final EntityManagerFactory entityManagerFactory;
@Autowired
public BankTransactionsItemReader(EntityManagerFactory entityManagerFactory) {
this.entityManagerFactory = entityManagerFactory;
}
@Override
public JpaPagingItemReader read() {
return bankTransactionsReader();
}
public JpaPagingItemReader bankTransactionsReader() {
final String SELECT_ALL_QUERY = "SELECT c FROM BankTransaction c where c.processed = false";
return new JpaPagingItemReaderBuilder()
.name("bankTransactionItemReader")
.entityManagerFactory(entityManagerFactory)
.queryString(SELECT_ALL_QUERY)
.saveState(false) // Ensures the reader does not maintain state between runs
.pageSize(10)
.build();
}
}
Код: Выделить всё
package com.dev.springbatch.batch;
import com.dev.springbatch.entity.BankTransaction;
import lombok.NonNull;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.batch.item.ItemProcessor;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
@Component
public class BankTransactionItemProcessor implements ItemProcessor {
private static final Logger logger = LoggerFactory.getLogger(BankTransactionItemProcessor.class);
private static final BigDecimal ONE_DOLLAR = BigDecimal.valueOf(1);
@Override
public BankTransaction process(@NonNull BankTransaction bankTransaction) {
return updateBankTransaction(bankTransaction);
}
// adding 1 dollar to the amount
private BankTransaction updateBankTransaction(BankTransaction bankTransaction) {
logger.info("Processing item: {}", bankTransaction);
BigDecimal updatedAmount = bankTransaction.getAmount().add(ONE_DOLLAR);
bankTransaction.setAmount(updatedAmount);
bankTransaction.setProcessed(true);
return bankTransaction;
}
}
Код: Выделить всё
package com.dev.springbatch.batch;
import com.dev.springbatch.entity.BankTransaction;
import com.dev.springbatch.repository.BankTransactionsRepository;
import jakarta.persistence.EntityManagerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.batch.item.Chunk;
import org.springframework.batch.item.ItemWriter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
public class BankTransactionsItemWriter implements ItemWriter {
private final BankTransactionsRepository bankTransactionsRepository;
private static final Logger logger = LoggerFactory.getLogger(BankTransactionsItemWriter.class);
@Autowired
public BankTransactionsItemWriter(final BankTransactionsRepository bankTransactionsRepository) {
this.bankTransactionsRepository = bankTransactionsRepository;
}
@Override
public void write(final Chunk
Подробнее здесь: [url]https://stackoverflow.com/questions/78691907/issue-with-my-spring-batch-configuration-job-reads-processes-writes-10-items[/url]