Модель транзакций JMS с операциями отправки и получения в Spring

#java #spring #transactions #jms #activemq

#java #spring #транзакции #jms #activemq

Вопрос:

Рассмотрим следующий грубый пример, где Spring управляет транзакциями в соответствии со стандартной настройкой загрузки Spring.

Используется менеджер транзакций по умолчанию, предоставляемый spring-boot-starter-data-jpa.

В этой транзакционной единице работы выполняются операции как с базой данных, так и с JMS.

 @Autowired JmsMessageOperations jmsMessageOperations;
@Autowired EntityManager entityManager;

@Transactional
public void doWork() {
    entityManager.persist(new Foo(1));
    entityManager.flush();

    jmsMessageOperations.convertAndSend(BAR_QUEUE, new Bar(1));

    entityManager.persist(new Foo(2));
    entityManager.flush();

    BazResponse bazResponse = 
        jmsMessageOperations.convertSendAndReceive(
            BAZ_QUEUE, 
            new Baz(1), 
            BazResponse.class);

    // here    
}
 

Что произойдет с этими сообщениями JMS (двумя исходящими и одним входящим), если в // here :

  • генерируется исключение отката,
  • что-то (или ничего) происходит, что приводит к фиксации транзакции.

Меня особенно интересует, как convertSendAndReceive(...) управляется, потому что, очевидно, ответ не может быть получен до тех пор, пока не будет зафиксирована отправка Baz — обрабатывается ли отправка в транзакции, отличной от отправки Bar ?

Хотя я ожидал бы, что реализация обмена сообщениями не будет иметь большого значения, меня больше всего интересует ActiveMQ.

Комментарии:

1. Не зная, что вы используете для управления транзакциями, на это невозможно ответить.

2. @M.Deinum я отредактировал в ссылке spring-boot-starter-data-jpa , которая автоматически настраивает диспетчер транзакций. Если вместо этого вы ссылались на сторону JMS, я также могу отредактировать эту информацию.

3. Если вы не используете диспетчер транзакций, который охватывает оба ресурса (т.Е. На основе JTA), тогда одна часть может зафиксироваться, а другая завершится с ошибкой. У вас есть 2 независимые транзакции.