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

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

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

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

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

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

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

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

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

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


person cornz    schedule 16.11.2018    source источник


Ответы (1)


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

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

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

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

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

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

person Scott Kurz    schedule 16.11.2018
comment
Я полностью согласен с тем, что элемент сначала повторяется в блоке, состоящем из одного элемента, и пока эта попытка повторяется, исключение пропуска имеет приоритет. Но я не могу найти часть спецификации, в которой говорится, что нужно пропустить обновление контрольной точки. Процесс в официальной спецификации, 11.9 Chunk with RetryListener стр. 124, также говорит о шаге q. что он возобновляется с S1 без выполнения строк r и s, которые кажутся обновлением контрольной точки. Но я новичок в спецификации и могу что-то упустить. По крайней мере, приятно слышать, что с BatchEE это не проблема, и я создам небольшой тестовый пример. - person cornz; 17.11.2018
comment
Правда, вы ничего не увидите про пропустить необходимость обновления контрольной точки при повторной попытке. На самом деле в спецификации прямо не говорится, что новая контрольная точка берется после любого пропуска. Предполагается, что очевидно, что пропуск означает отказ от отката, повторной попытки или сбоя выполнения. Поскольку контрольная точка берется в конце обычного фрагмента, то, ну, контрольная точка должна быть взята в конце фрагмента, включающего пропущенный элемент. Это также относится к специальному блоку, состоящему из одного элемента, который используется при повторной попытке после отката. Итак, я не говорю, что спецификация не могла быть более ясной. Просто реконструирую рассуждения. - person Scott Kurz; 17.11.2018
comment
Для справки: я упомянул Liberty Batch, а не BatchEE. - person Scott Kurz; 17.11.2018
comment
Хорошо, я думал, что WLP использует batchEE. По крайней мере, это ошибка в jberet, я открываю проблему github.com/jberet/jsr352/issues / 116 - person cornz; 18.11.2018
comment
Благодарим за сообщение и исследование этой проблемы с помощью JBeret. Мы рассмотрим это. - person cheng; 19.11.2018
comment
Рассматривая проблему JBeret, позвольте мне просто отметить, что, хотя поведение контрольных точек определено достаточно четко, счетчики метрик могут не совпадать между реализациями. Так что будьте осторожны, придавая им слишком большое значение при тестировании. - person Scott Kurz; 19.11.2018