Добро пожаловать в переполнение стека!
В случае ошибки, вызванной оператором stopOnException()
, Splitter прерывает обработку.
Это означает, что для вашей цели выполнить полный откат
- У вас все в порядке для всех еще не обработанных записей.
- Ваша проблема - это уже успешно обработанные записи
Для них вы должны запустить логи компенсации c как часть ваш откат. Например, если уже обработанные записи записываются в базу данных, вы можете удалить их позже, когда произойдет сбой в Splitter.
Добавлено из-за комментариев
Согласно Splitter docs , поскольку вы используете shareUnitOfWork()
, вы должны получить только одно сообщение об ошибке, когда Splitter завершен и произошла как минимум 1 ошибка (вместо одного сообщения об ошибке на неудачное подсообщение). Поэтому, если вы также используете useOriginalMessage()
в обработчике ошибок, вы должны получить исходное сообщение IN.
Если это не сработает, может столкнуться с stopOnException()
(никогда не пробовал). Это была бы попытка удалить stopOnException()
и проверить, работает ли он так.
Вы не можете напрямую компенсировать уже доставленное сообщение JMS, но вы можете построить компенсацию , которую вы можете запустить впоследствии . Например, отправьте неудачные сообщения из обработчика ошибок в другую очередь, потребитель которой откатывает все, что было сделано первым сообщением.