Пакет jsr 352 с повторяющимся и пропускаемым исключением может обрабатывать элементы много раз
У меня есть пакет, реализованный с помощью JSR-352 (с использованием jberet на wildfly).
У меня есть кусок с номером 15 и java.lang.Exception
настроен как повторяемое и пропускаемое исключение.
Когда есть много исключений, большинство элементов будет обработано несколько раз. В этом крайнем случае все элементы будут вызывать исключение в авторе:
- Первые 15 пунктов прочитаны
- Исключение происходит по первому пункту
- Чанк откатывается и настраивается с item-count = 1
- Первый пункт прочитан
- Возникает исключение, элемент пропущен
- Приступить к остальным 14 пунктам, исключение может возникнуть для каждого элемента, каждый элемент пропускается
- После первых 15 предметов чанк возвращается с количеством предметов = 15
- Пункты 16-30 читаются
- Исключение происходит снова
- Читатель откатился до последней контрольной точки
На этом этапе все еще нет контрольной точки, потому что еще не было успешно обработанного элемента. Следовательно, читатель снова начинает с первого пункта. Все 30 товаров обрабатываются с количеством предметов = 1. и т. Д.
Если таких отказов много, партия будет обрабатывать все элементы снова и снова.
Я думаю, что контрольная точка должна быть установлена также для пропущенных элементов, потому что пропущенный элемент не должен обрабатываться снова.
Я думаю, что это ошибка в спецификации, поэтому я уже открыл там проблему: https://github.com/WASdev/standards.jsr352.batch-spec/issues/15 Или я ошибаюсь и неправильно понял реализацию?
Как это реализовано в Spring Batch?
1 ответ
Я думаю, что спецификация достаточно ясна, что предполагает, что это может быть ошибка JBeret (при условии, что это не проблема приложения).
В спецификации (неофициальная версия здесь) раздел:
8.2.1.4.3 Повторите попытку и пропустите одно и то же исключение
говорит, что во время повторной попытки с откатом элементы обрабатываются по одному (в виде фрагментов из одного элемента), и этот пропуск имеет приоритет при повторной попытке.
Поэтому, если во время повторной попытки возникает исключение с возможностью пропуска, этот элемент будет просто пропущен, и обновленная контрольная точка должна сохраняться. Вот как это делает WebSphere Liberty Batch, реализация JSR 352, над которой я работаю.
Поэтому я бы предложил создать воссозданный проект и открыть вопрос JBeret, если он все еще выглядит так. На данный момент я не вижу проблемы со спецификацией.