TL; DR
нет, обычно вам не нужно комментировать какой-либо метод @Transactional
, чтобы заставить транзакции Camel работать .
Основное взаимодействие между Camel и Spring TransactionManager заключается в том, что Camel делегирует обработку транзакций Spring txManager, если он настроен для этого.Другими словами: Camel использует Spring txManager, если он доступен, но вы также можете использовать другие txManager.
Для этого делегирования @Transactional
аннотации не нужны.Вместо этого вам нужно настроить Spring txManager и отметить маршрут Camel как transacted()
.
Длинная история
Однако ваш вопрос оставляет место для предположений.Какой метод вы хотите аннотировать @Transactional
?Метод, который содержит маршрут?Метод управляемого компонента, который вызывается маршрутом?Метод, полностью независимый от маршрута верблюда?
Транзакция Маршрут верблюда создает область транзакции вокруг всего маршрута (1) или, более точно, единица работы .
Давайте рассмотрим пример: маршрут, который читает из очереди JMS, преобразует данные и записывает в несколько других очередей JMS.Если вы отметили маршрут как пройденный, и при отправке последнего сообщения произошла ошибка, транзакция откатывается и сообщения не отправляются.
Благодаря объему транзакции уже отправленные (исходящие) сообщения не фиксируются, пока транзакция не завершится успешно.После отката то же сообщение (входящее) доставляется посредником и снова обрабатывается маршрутом.
Обратите внимание, что на верблюжьем маршруте можно совершить без маркера transacted()
(2) в маршруте.
Однако, поскольку Camel занимается интеграцией, у вас часто бывают «смешанные среды», такие как JMS для базы данных.Или еще хуже, вы делаете HTTP-запросы во время маршрута.Если позже произойдет ошибка, вы не сможете отменить эти вызовы.
Следовательно, в мире Camel транзакции могут сильно помочь, но зачастую их недостаточно.Вы должны реализовать компенсации , чтобы иметь возможность реально откатить прерванную обработку маршрута.
Если вы используете транзакционные маршруты, обязательно напишите Тесты маршрута , которые симулируют ошибкив обработке маршрута и проверьте, работает ли откат, как вы ожидаете.
Что ж, это некоторые мысли высокого уровня о верблюде и транзакциях.Если вы хотите погрузиться глубже, получите книгу «Верблюд», которую я рекомендовал в комментариях :-)
Сноски:
(1) Когда маршрут содержит компоненты с состоянием или EIP(например, агрегатор , resequencer и т. д.), они вводят границы транзакций внутри маршрута Camel.В таких случаях область транзакции заканчивается в первом компоненте с состоянием.Как следствие, эти компоненты обычно предлагают дополнительное сохранение, чтобы предложить возможность сохранить состояние.
Чтобы сделать такие границы транзакций явными, я обычно не продолжаю в том же маршруте после такого компонента, но создаю новый и отправляю сообщение о результате компонента с состоянием на новый маршрут.
(2) Например, с потребителем JMS, который использует локальные транзакции JMS.