Пакет jsr 352 с повторяющимся и пропускаемым исключением может обрабатывать элементы много раз - PullRequest
0 голосов
/ 16 ноября 2018

У меня есть пакет, реализованный с помощью JSR-352 (с использованием jberet для wildfly).

У меня есть чанк с номером элемента 15, а java.lang.Exception настроен как исключение, которое можно повторить и пропустить.

Когда есть много исключений, большинство элементов будет обработано несколько раз.В этом крайнем случае все элементы будут вызывать исключение в авторе:

  • Первые 15 элементов считываются
  • Исключение возникает для первого элемента
  • Чанк откатывается исконфигурировано с числом элементов = 1
  • Первый элемент считан
  • Возникает исключение, элемент пропускается
  • Продолжите работу с другими 14 элементами, исключение может возникнуть для каждого элемента,каждый элемент пропускается
  • После первых 15 элементов возвращается чанк с числом элементов = 15
  • Элементы 16-30 считываются
  • Возникает исключение
  • Считыватель откатывается до последней контрольной точки

На данный момент контрольной точки по-прежнему нет, поскольку еще не было успешно обработанного элемента.Следовательно, читатель снова начинает с первого пункта.Все 30 элементов обрабатываются с числом элементов = 1. и т. Д.

Если таких отказов много, партия будет обрабатывать все элементы снова и снова.

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

Я думаю, что это ошибка в спецификации, поэтому я уже открыл там проблему: https://github.com/WASdev/standards.jsr352.batch-spec/issues/15 Или я ошибаюсь и неправильно понялреализация?

Как это реализовано в Spring Batch?

1 Ответ

0 голосов
/ 16 ноября 2018

Я думаю, что спецификация достаточно ясна, что предполагает, что это может быть ошибка JBeret (при условии, что это не проблема приложения).

В спецификации (неофициальная версия здесь ), раздел:

8.2.1.4.3 Повторить попытку и пропустить одно и то же исключение

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

Таким образом, если во время повторной попытки возникает исключение с возможностью пропуска, этот элемент будет просто пропущен, и обновленная контрольная точка должна сохраняться. Вот как это делает WebSphere Liberty Batch , реализация JSR 352, над которой я работаю.

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

...