2017-02-26 130 views
1

我們需要在一個事務中確保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> 

的方法請確認的理解是正確的。此外,有下面的查詢

  1. 在此方案中所必需的TransactionAwareConnectionFactoryProxy
  2. JMS隊列和JDBC是兩個獨立的事務資源。被注入的JDBC事務管理器爲JMS適配器顯示在此相當於例如使用ChainedTransactionManager(鏈接JMS交易Mananger和JDBC事務管理器)

回答

1

對於TransactionAwareConnectionFactoryProxy,請諮詢公司的JavaDocs:

* Proxy for a target CCI {@link javax.resource.cci.ConnectionFactory}, adding 
* awareness of Spring-managed transactions. Similar to a transactional JNDI 
* ConnectionFactory as provided by a Java EE server. 
* 
* <p>Data access code that should remain unaware of Spring's data access support 
* can work with this proxy to seamlessly participate in Spring-managed transactions. 
* Note that the transaction manager, for example the {@link CciLocalTransactionManager}, 
* still needs to work with underlying ConnectionFactory, <i>not</i> with this proxy. 

我不確定這與您關於JMS + DB事務的請求有什麼關係,但我認爲您應該擔心支持這些事務資源的事務管理器。

爲此目的,Spring爲XA事務建議JtaTransactionManager。 還是可以考慮根據戴維Syer文章使用ChainedTransactionManagerhttp://www.javaworld.com/article/2077963/open-source-tools/distributed-transactions-in-spring--with-and-without-xa.html

UPDATE

如果本地事務很適合你,你真的可以繼續與TransactionAwareConnectionFactoryProxy及其synchedLocalTransactionAllowedtrue。當然,直接從<int-jms:message-driven-channel-adapter>使用DataSourceTransactionManager

否則,你必須去與ChainedTransactionManager。這個解決方案的確給第一個TransactionAwareConnectionFactoryProxy增加了一些開銷。

+0

我經歷了Dave文章中的best-jms-db項目。它將一個DataSourceTransactionManager bean注入到jms:listener-container(我將這個transactionManager注入到基於Message Listener容器的消息驅動通道適配器中),但不使用任何JmsTransactionManager。我無法在此項目或JTA事務管理器中看到任何明確的鏈接。在此示例中,如何同步JMS事務資源和JDBC事務資源。 – vjm

+0

請在回答中看看我的UPDATE。 –

+0

謝謝,你能不能也表明這兩個approaches-之間的區別是本地事務1PC(因此需要處理重複消息)當ChainedTransactionManager 2PC – vjm