Пакет 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, если он все еще выглядит так. На данный момент я не вижу проблемы со спецификацией.

Другие вопросы по тегам