Связь между Spring @Transactional и Camel Transacted - PullRequest
0 голосов
/ 20 марта 2019

Если верблюжий DSL помечен как transacted (), то действительно ли нам нужно помещать аннотацию @Transactional в метод сервиса Spring?

Я действительно хочу знать о взаимодействии между верблюдом и Spring и транзакцией Spring.

Любая помощь будет высоко оценена.

1 Ответ

0 голосов
/ 28 марта 2019

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.

...