У меня есть весеннее веб-приложение, работающее на jboss, которое в настоящее время настроено на использование HibernateTransactionManager для транзакций в БД и JmsTransactionManager для jms. Для jms мы используем Camel и ActiveMQ, нашей базой данных является DB2. В рамках транзакции мне нужно записать несколько записей в базу данных и отправить два асинхронных сообщения JMS. Сообщения jms являются уведомлениями о событиях, и я хочу, чтобы они отправлялись только в случае фиксации транзакции базы данных.
Я готов принять риск сбоя связи с брокером после того, как транзакция jdbc уже зафиксирована (и, следовательно, нет сообщений, отправленных, но db зафиксирован), поэтому я не думаю, что мне нужен правильный XA.
Я считаю, что мне нужно управление транзакциями «из лучших сил» с использованием весенней синхронизации транзакций.
Документация Spring намекает на то, что spring синхронизирует две транзакции и зафиксирует транзакцию jms только после фиксации транзакции jdbc, но я не думаю, что это очень ясно. В весенней документации здесь 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#setSessionTransacted%28boolean%29 Javadoc для setSessionTransacted здесь звучит как то, что я хочу.
Из того, что я видел, я думаю, что достаточно создать Camel JmsConfiguration с установленным значением true, как это:
<bean id="jmsConfig" class="org.apache.camel.component.jms.JmsConfiguration">
<property name="connectionFactory" ref="pooledConnectionFactory"/>
<property name="transacted" value="true"/>
<property name="concurrentConsumers" value="10"/>
</bean>
Однако мне нужно убедить кого-то, с кем я работаю, кто немного скептически настроен и считает, что мой интеграционный тест работает только из-за плохо документированного побочного эффекта, а не из-за преднамеренной функции пружины.
Так что мой вопрос - я прав, что на пружину можно положиться, чтобы синхронизировать транзакции и всегда фиксировать транзакцию jms после транзакции jdbc, или это не то, на что я должен положиться, и не могли бы вы указать мне на любого чиновника? документация, которая говорит это ясно? И я полагаю, что в целом это хороший подход или мы должны управлять этими транзакциями по-другому?