Spring Transaction Synchronization of JDBC and JMS

У меня есть весеннее веб-приложение, работающее на jboss, которое в настоящее время настроено на использование HibernateTransactionManager для транзакций с базами данных и JmsTransactionManager для jms. Для jms мы используем Camel и ActiveMQ, наша база данных - DB2. В рамках транзакции мне нужно записать несколько записей в базу данных и отправить два асинхронных сообщения jms. Сообщения jms - это уведомления о событиях, и я хочу, чтобы они отправлялись только в случае фиксации транзакции базы данных.

Я готов принять риск сбоя связи с брокером после того, как транзакция jdbc уже зафиксирована (и, следовательно, сообщения не отправлены, но db зафиксировано), поэтому я не думаю, что мне нужен надлежащий XA.

Я считаю, что мне нужно "максимально возможное" управление транзакциями с использованием весенней синхронизации транзакций.

Документация Spring как бы намекает на тот факт, что Spring синхронизирует две транзакции и фиксирует транзакцию jms только после того, как транзакция jdbc была зафиксирована, но я не думаю, что это очень ясно. Документация по Spring здесь http: // static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/transaction.html#tx-resource-synchronization не дает достаточно подробностей о том, как это работает.

Я нашел несколько других источников, в которых говорится, что spring будет делать то, что я хочу, включая некоторые javadoc ниже, и я написал несколько интеграционных тестов, которые также это показывают.

http://static.springsource.org/spring/docs/3.0.x/api/org/springframework/jms/support/JmsAccessor.html#setSessionTransact%28boolean%29 Документ javadoc на setSessionTransaked здесь звучит как именно то, что я хочу.

Судя по тому, что я видел, я думаю, что создания Camel JmsConfiguration с транзакцией, установленной в true, достаточно:


    
    
    

Однако мне нужно убедить кого-то, с кем я работаю, который настроен немного скептически и считает, что мой интеграционный тест работает только потому, что из-за плохо задокументированного побочного эффекта, а не из-за преднамеренной пружинной особенности.

Итак, мой вопрос: я прав, что Spring можно полагаться на синхронизацию транзакций и всегда фиксировать транзакцию jms после транзакции jdbc, или это не то, на что я должен полагаться, и не могли бы вы указать мне на любое официальное лицо? документация, которая ясно говорит об этом? И я думаю, что в целом это хороший подход, или мы должны управлять этими транзакциями по-другому?

16
задан Cœur 7 April 2018 в 05:44
поделиться