Наше приложение Spring Batch после перезапуска неудачного задания снова обрабатывает те же записи, что приводит к дублированию строк, и мы хотим понять, как этого избежать.
Поллер Spring Integration, запускающий пакетное задание, настроен на запуск каждые пару часов. При повторном запуске параметры задания будут такими же, но если предыдущий запуск завершился неудачно (например, из-за исключения DataTruncation), Spring Batch не будет жаловаться на то, что задание уже выполнено.
В момент сбоя несколько сотен тысяч записей уже были обработаны и скопированы из исходной таблицы в целевую. Когда задание запускается в следующий раз, те же строки будут скопированы в целевую таблицу, что приведет к дублированию. Таким образом, похоже, что работа не возобновляется, а перезапускается с самого начала.
База данных Spring Batch - это Derby (файловая), она настраивается при запуске приложения, и, похоже, состояние не поддерживается между перезапусками фактического приложения (потому что задание может быть запущено снова с теми же параметрами). Однако при одном запуске приложения состояние сохраняется. Например, если задание завершится успешно, при следующем запуске опроса будет выдано исключение, потому что задание (с этими параметрами) уже завершено.
Наша работа заключается в следующем:
<batch:job id="publisherJob" >
<batch:step id="step1">
<batch:tasklet >
<batch:chunk reader="itemReader" processor="itemProcessor"
writer="itemWriter" commit-interval="${...}" />
</batch:tasklet>
<batch:listeners>
...
</batch:listeners>
</batch:job>
<bean id="itemReader" class="org.springframework.batch.item.database.JdbcCursorItemReader">
<property name="dataSource" ref="dataSource" />
<property name="sql" value="select ${...} from ${...} where ${...}" />
<property name="rowMapper" ref="rowMapper" />
</bean>
Предложение WHERE включает ORDER BY.
Мы понимали, что Spring Batch сохранит состояние, в котором обработка завершилась неудачно, и продолжит работу с этой точки (если ошибка в исходной таблице была исправлена), тем самым предотвращая дублирование строк. Что нужно настроить, чтобы это произошло?
Спасибо