我們需要在一個事務中確保JMS消息未確認的情況下,任何錯誤DB中拋出堅持從JMS隊列堅持消息數據庫事務代理。 基於這裏 - Transaction handling while using message driven channel adapter & service activator 提供的解決方案下面是我來到同步JMS消息隊列和JDBC交易 - 是需要
<int-jms:message-driven-channel-adapter id="jmsIn"
transaction-manager="transactionManager"
connection-factory="sConnectionFactory"
destination-name="emsQueue"
acknowledge="transacted" channel="jmsInChannel"/>
<int:channel id=" jmsInChannel " />
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="org.hsqldb.jdbcDriver" />
<property name="url" value="jdbc:hsqldb:mem:testdb" />
</bean>
<!-- Transaction manager for a datasource -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="sconnectionFactory" class="org.springframework.jms.connection.TransactionAwareConnectionFactoryProxy">
<property name="targetConnectionFactory">
<bean class="project.TestConnectionFactory">
</bean>
</property>
<property name="synchedLocalTransactionAllowed" value="true" />
</bean>
的方法請確認的理解是正確的。此外,有下面的查詢
- 在此方案中所必需的TransactionAwareConnectionFactoryProxy
- JMS隊列和JDBC是兩個獨立的事務資源。被注入的JDBC事務管理器爲JMS適配器顯示在此相當於例如使用ChainedTransactionManager(鏈接JMS交易Mananger和JDBC事務管理器)
我經歷了Dave文章中的best-jms-db項目。它將一個DataSourceTransactionManager bean注入到jms:listener-container(我將這個transactionManager注入到基於Message Listener容器的消息驅動通道適配器中),但不使用任何JmsTransactionManager。我無法在此項目或JTA事務管理器中看到任何明確的鏈接。在此示例中,如何同步JMS事務資源和JDBC事務資源。 – vjm
請在回答中看看我的UPDATE。 –
謝謝,你能不能也表明這兩個approaches-之間的區別是本地事務1PC(因此需要處理重複消息)當ChainedTransactionManager 2PC – vjm