Отключить обработку отдельного элемента Spring Batch в ситуации пропуска - PullRequest
0 голосов
/ 20 мая 2018

У меня есть работа, которая обрабатывает элементы кусками (из 1000).Элементы объединяются в одну полезную нагрузку JSON и отправляются в удаленный сервис в виде пакета (все 1000 в одном HTTP POST).Иногда удаленная служба отключается, и время соединения истекает.Я настроил пропуск для этого

    return steps.get("sendData")
            .<DataRecord, DataRecord> chunk(1000)
            .reader(reader())
            .processor(processor())
            .writer(writer())
            .faultTolerant()
            .skipLimit(10)
            .skip(IOException.class)
            .build();

. Если порция не удается, пакет повторяет порцию, но по одному элементу за раз (чтобы выяснить, какой элемент вызвал сбой), но в моем случае нет одного элементавызвавший сбой, это тот случай, когда весь чанк преуспевает или терпит неудачу как чанк и должен быть повторен как чанк (на самом деле, переход в режим одного элемента приводит к тому, что удаленная служба очень злится и отказывается принимать данныеМы не контролируем удаленный сервис).

Какой мой лучший выход из этого?Я пытался выяснить, смогу ли я отключить режим повторения одного элемента, но я даже не до конца понимаю, где это происходит.Есть ли кастом SkipPolicy или что-то, что я могу реализовать?(методы, которые там не выглядели, были полезны)

Или есть какой-то способ заставить считыватель элементов прочитать 1000 записей, но передать его автору как List (1000 входных элементов => один выходпункт)

1 Ответ

0 голосов
/ 22 мая 2018

Позвольте мне пройтись по двум частям.Сначала я объясню, почему это работает так, как работает, затем я предложу вариант решения вашей проблемы.

Почему повторная попытка элемента по элементу

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

Как обрабатывать повторы с помощью фрагмента

То, к чему это приводит,вам нужно получить размер фрагмента 1, чтобы это работало.Это означает, что вместо того, чтобы полагаться на Spring Batch для перебора элементов в чанке для ItemProcessor, вам придется сделать это самостоятельно.Таким образом, ваш ItemReader вернет List<DataRecord>, а ваш ItemProcessor зациклит этот список.Ваш ItemWriter займет List<List<DataRecord>>.Я бы порекомендовал создать декоратор для ItemWriter, который разворачивает внешний список перед передачей его основному ItemWriter.

Это лишает возможности делать истинный пропуск одного элемента в этом списке, ноПохоже, что это нормально для вашего случая использования.

...