Я ожидаю, что верблюд попытается доставить в соответствии с политикой повторной доставки (работает), но MQ не должен повторно доставлять
Когда MQ никогда не должен делать повторную доставку (потому что вы обрабатываете ошибки в Camel), вы должны удалить acknowledgementModeName=CLIENT_ACKNOWLEDGE
или явно установить AUTO_ACKNOWLEDGE
(значение по умолчанию).
Пока сообщение не подтверждено, оно с точки зрения брокера не доставляется. AUTO_ACKNOWLEDGE
немедленно подтверждает сообщение после потребления, что имеет смысл, если вы никогда не хотите получать доставку.
CLIENT_ACKNOWLEDGE
, с другой стороны, подтверждает сообщение только при определенных условиях, см. этот пост для получения дополнительной информации об этом .
РЕДАКТИРОВАТЬ из-за комментария с новой информацией
Если вы хотите получать MQ, но в большинстве случаев «переопределять» их с помощью Camel, вам нужно потреблять сообщения, обработанные .
Используйте локальных транзакций JMS-брокера , настроив свой компонент JMS следующим образом
jmsComponent.setLazyCreateTransactionManager(false);
jmsComponent.setTransacted(true);
Для транзакций этого типа вам вообще не нужен Spring TransactionManager. Поэтому я думаю, что JPATransactionManager
игнорируется JMS , и ваши JMS-ресурсы должны быть транзакционными.
Теперь, когда ваш обработчик ошибок Camel «проглатывает» исключение с помощью handled(true)
, повторная доставка MQ не должна выполняться. Но MQ выполняет повторную доставку, когда исключение передается обратно брокеру.
Я ожидаю, что мой верблюжий маршрут будет выполняться в одной транзакции БД
Я не нашел в вашем вопросе ничего о неработающих транзакциях базы данных. Кажется, есть только один процессор, который работает с базами данных. Если это не работает должным образом, опишите проблему в своем вопросе или отдельном вопросе.