ItemWriter коммит оправдывает первый интервал фиксации
Я пытаюсь выбрать данные из базы данных, обновить каждый объект, а затем обновить базу данных в элементе записи.
Я пытался очищать DAO после каждого обновления, но ничего не изменилось.
Конфигурация очень проста с читателем, писателем и интервалом коммитов 100.
Читатель работает как положено:
@Override
public Order read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException {
if(iterator == null) {
List<Order> all = findOrders();
iterator = all.listIterator();
}
if (iterator.hasNext()) {
return iterator.next();
} else {
return null;
}
}
Писатель тоже очень прост:
public void write(List<? extends Order> items) throws Exception {
@SuppressWarnings("unchecked")
List<Order> listOrder = (List<Order>) items;
try {
for(Order o : listOrder) {
etatCommandeServiceImpl.updateEtatCommande(o);
}
}catch(Exception e) {
if (log.isErrorEnabled()) {
log.error("ERROR {}", e);
}
throw e;
}
}
Проблема в том, что первые 100 записей зафиксированы, но не остальные. Spring batch table показывает, что он читает все записи и фиксирует их несколько раз, но когда я проверяю базу данных, она просто фиксируется один раз.
Версия Spring-batch - 2.2.6.
ОБНОВИТЬ
Я думаю, что эта проблема связана с транзакцией с базой данных, потому что теперь она вообще не фиксируется в базе данных. Но я не могу понять это на данный момент.
1 ответ
Проблема в том, что вы возвращаете null из ItemReader. Если вы вернете значение null,Spring будет предполагать, что конец подачи достигнут и завершит работу. Поскольку вы возвращаете нулевое значение после каждого фрагмента (в вашем случае 100), пакет Sprint завершается после обработки 100 записей.
Пожалуйста, создайте метод с помощью @PostConstruct и извлеките все записи, которые вы хотите обработать, и измените ваш ItemReader, чтобы он возвращал 1 за раз и ноль, когда все записи прочитаны.