Как обрабатывать транзакции, связанные с сообщением Spring/JMS и базой данных

У меня есть метод, который получает счет, создает XML и отправляет этот XML в очередь JMS, а затем сохраняет счет в БД с обновленным статусом, например «выставлен счет». Ниже приведен псевдокод, в котором задействованы Spring и Hibernate. Мой вопрос: является ли сбой при сохранении в спящем режиме откатом отправки Jms или, если отправка JMS не удалась, как я могу откатить сохранение статуса счета-фактуры? это подпадает под управление распределенными транзакциями. О каких транзакционных случаях здесь идет речь. Спасибо.

 @Transactional(propagation=Propagation.Required)    
 void processInvoices(invoice ){
           String xml = createXML(invoice);
           messageService.sendInvoice(xml );
           invoice.setStatus("invoiced");
           save(invoice);

  }

person varaJ    schedule 25.08.2014    source источник


Ответы (1)


Насколько я знаю и насколько я понимаю из вашего вопроса, вы хотите синхронизировать гибернацию и транзакцию JMS. Для этого вам нужно будет использовать JTA для управления транзакциями как в Hibernate, так и в JMS.

Подробнее @ Spring, синхронизирующий транзакции Hibernate и JMS

person Amogh    schedule 25.08.2014
comment
Спасибо за быстрый ответ. Этот оператор из ссылки, которую вы упомянули. Когда я вызываю send() в JmsTemplate, сообщение не отправляется немедленно, а скорее сеанс JMS фиксируется с сеансом Hibernate по мере возврата метода., для Spring @transactional верно для моего случая , правильно? т.е. когда мой счет будет сохранен, в очереди будет только xml, верно? - person varaJ; 25.08.2014