ItemWriter коммит оправдывает первый интервал фиксации - PullRequest
0 голосов
/ 06 мая 2019

Я пытаюсь выбрать данные из базы данных, обновить каждый объект, а затем обновить базу данных в элементе записи.

Я пытался очищать 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 показывает, что она читает все записи и фиксирует несколько раз, но когда я проверяю базу данных, она просто фиксируется один раз.

Версия Spring-batch - 2.2.6.

ОБНОВЛЕНИЕ

Я думаю, что эта проблема связана с транзакцией с базой данных, потому что теперь она вообще не фиксируется в базе данных.Но я не могу понять это на данный момент.

1 Ответ

1 голос
/ 06 мая 2019

Проблема в том, что вы возвращаете null из ItemReader. Если вы вернете значение null, Spring будет предполагать, что конец подачи достигнут и завершит работу. Поскольку вы возвращаете нулевое значение после каждого фрагмента (в вашем случае 100), пакет Sprint завершается после обработки 100 записей.

Пожалуйста, создайте метод с @PostConstruct и извлеките все записи, которые вы хотите обработать, и измените ваш ItemReader, чтобы он возвращал 1 за раз и ноль, когда все записи прочитаны.

...