#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 независимые транзакции.