![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
fitdnu2014 |
|
||||||||
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 11.9.2014 Репутация: нет Всего: нет |
Добрый день всем! Хочу использовать ActiveMQ для отправки сообщения в очередь при изменении данных в БД (Sybase). Для управления транзакциями БД в приложении используется Spring DataSourceTransactionManager. Для отправки сообщений в очередь использую JmsTemplate. Проблема заключается в том, что нужно в рамках одной транзакции сделать примерно слюдующие действия:
Шаг 1: апдэйт БД; Шаг 2: отправка сообщения в очередь; Шаг 3: апдэйт БД; Шаг 4: отправка сообщения в очередь. Если на каком-то этапе возникает исключение - нужно откатить всю транзакцию целиком. Как я понял из документации по JmsTemplate, в моём случае я должен установить параметр "sessionTransacted" = true:
Конфигурационный файл для JMS содержит только две секции:
Решил проверить работоспособность этого, кидая запросы на два простых метода, которые прикрутил к контроллеру:
Но в обоих случаях сообщение попадает в очередь. Даже если возникает исключение (в методе sendMessageTransactionalErr), и происходит роллбэк транзакции JDBC, JMS-ная транзакция всё равно завершается успешно. Что я должен сделать, чтобы заставить эту схему работать так как мне нужно? |
||||||||
|
|||||||||
d_k |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 76 Регистрация: 20.7.2004 Репутация: 1 Всего: 1 |
ну во первых, чекед эксепшин не приведет к откату трензакции, если явно не прописан rollBackFor, а во вторых тут нужны нелокальные а глобальные транзакции, т.е. надо корректно сконфигурить менеджер транзакций, датасорс заменить на XA.
Но! С ActiveMq этого не выйдет, поскольку эта реализация jms не поддерживает глобальные транзакции... |
|||
|
||||
fitdnu2014 |
|
||||
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 11.9.2014 Репутация: нет Всего: нет |
Спасибо за наводку, совсем забыл уже, что контролируемые эксепшены не откатывают транзакцию. Удивительно, но после добавления
сообщение в очередь не попадает ![]() P.S.: Попробую потестировать ещё на более сложных примерах, позже отпишусь о результатах. |
||||
|
|||||
fitdnu2014 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 11.9.2014 Репутация: нет Всего: нет |
Протестировал более сложный вариант - апдэйт БД + отправка сообщения в цикле несколько раз, и затем пробросил исключение - транзакция откатилась и сообщения в очередь не попали. Причём когда закомментировал флаг "sessionTransacted" = true - соощебния попадают в очередь даже при откате транзакции. Так что вопрос можно считать решённым
![]() Это сообщение отредактировал(а) fitdnu2014 - 15.9.2014, 10:09 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |