Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / IBM DB2, WebSphere, IMS, U2, etc Новый топик    Ответить
 Транзакционность считывания из MQ и записи в БД  [new]
Tyo
Member

Откуда: Столица
Сообщений: 464
В приложении на WAS7 читаю сообщения из MQ-очереди стандартным образом через MDB и Activation Spec. После чего MBD что-то там делает с сообщениями и что-то пишет в БД.

Подскажите плз, есть ли способ обеспечить транзакционность этих двух действий -- считывание из MQ и запись в БД?
То есть сделать так, чтобы сообщение выгребалось из очереди только в том случае, если запись в БД прошла успешно. А если нет -- чтобы сообщение оставалось в очереди.

Заранее спасибо
14 ноя 12, 11:15    [13469972]     Ответить | Цитировать Сообщить модератору
 Re: Транзакционность считывания из MQ и записи в БД  [new]
alienrom
Guest
Нет.
Где-то видел подобный вопрос...
14 ноя 12, 11:19    [13470004]     Ответить | Цитировать Сообщить модератору
 Re: Транзакционность считывания из MQ и записи в БД  [new]
Евгений Хабаров
Member

Откуда: Москва
Сообщений: 773
Tyo,

Да, можно.
Это функционал любого сертифицированного J2EE-сервера.
В общем случае все участники транзакции должны поддерживать двухфазные транзакции.

Транзакцией может управлять контейнер (Container-Managed) или приложение (Bean-Managed для EJB/MDB).
Подробнее про это можно прочитать в The Java EE 5Tutorial раздел 33.Transactions.
Еще более подробно в официальной спецификации J2EE 5, раздел "Transaction Management".
SR-000244 Java Platform, Enterprise Edition 5 Specification (Final Release)

Касательно MDB/MQ/Activation Spec - нужно выполнить необходимые настройки в самом Activation Spec и в MQ чтобы решить что делать с сообщением если его не удалось обработать определенное количество раз. В качестве подсказки и варианта - Backout Queue.

Особенности настройки сервера приложений для двухфазных транзакций с конкретными СУБД нужно читать в руководстве на сервер приложений.
14 ноя 12, 11:54    [13470358]     Ответить | Цитировать Сообщить модератору
 Re: Транзакционность считывания из MQ и записи в БД  [new]
Tyo
Member

Откуда: Столица
Сообщений: 464
Евгений Хабаров,
Глянул, спасибо, примерно понятно.
Фактически достаточно для CMP в нужном месте поставить setRollbackOnly и нормально настроить ActSpec, чтобы она не захлебнулась в отвергнутых сообщениях...
14 ноя 12, 12:10    [13470561]     Ответить | Цитировать Сообщить модератору
 Re: Транзакционность считывания из MQ и записи в БД  [new]
Евгений Хабаров
Member

Откуда: Москва
Сообщений: 773
Tyo
Евгений Хабаров,
Глянул, спасибо, примерно понятно.
Фактически достаточно для CMP в нужном месте поставить setRollbackOnly и нормально настроить ActSpec, чтобы она не захлебнулась в отвергнутых сообщениях...

Да, в общем именно так.
А в особо "фатальных" случаях можно из MDB выкинуть RuntimeException, что, при обычных настройках ActSpec, приведет к его останову. Например для случая, когда СУБД "упала", или пропали права/возможность записи.
14 ноя 12, 12:32    [13470820]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Транзакционность считывания из MQ и записи в БД  [new]
talent
Member

Откуда:
Сообщений: 54
Доброго времени суток! Есть SessionBean, в этом бине есть метод, что-то вроде
public String insertIntoTable() {
   SessionContext sessionContext;
   try {
      ...
      ...
      //делаем инсерт
      String query = "SELECT id INTO var_id FROM NEW TABLE (INSERT INTO my_table.....";
      String res = executeQuery(query);
      //после делаем проверку нет ли аналогичной записи в таблице 
      boolean duplicate = checkDuplicate();
      if (duplicate) {
         sessionContext.setRollbackOnly();
      }
      ...
   } catch (Exception ex) {
      sessionContext.setRollbackOnly();
   }
}

Вопрос - будет ли rollback инсерта, так сказать откат JDBC-транзакции вместе с откатом управляемой контейнером транзакции? Предполагаю, что отката инсерта не будет, но хочется услышать подтверждение или опровержение. Нашел вот такое утверждение
Менеджер транзакций J2EE управляет всеми транзакциями корпоративного компонента за исключением управляемых компонентом JDBC-транзакций

Заранее спасибо!
22 июн 17, 22:14    [20584873]     Ответить | Цитировать Сообщить модератору
Все форумы / IBM DB2, WebSphere, IMS, U2, etc Ответить