【发布时间】:2017-07-17 02:45:26
【问题描述】:
我们需要在事务中将消息从 JMS 队列持久化到数据库,以确保在 DB 持久化期间抛出任何错误时不会确认 JMS 消息。 基于此处提供的解决方案-Transaction handling while using message driven channel adapter & service activator 以下是我到达的方法
<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 事务管理器和 JDBC 事务管理器)
【问题讨论】:
标签: spring-integration spring-jms