可以弹出事务管理器能够管理2个pc事务吗?

时间:2015-10-18 19:18:57

标签: java spring transactions spring-transactions spring-jms

我在我的应用 jms 数据库中使用了2种资源。我已经配置如下,我正在按照下面的顺序进行一个简单的测试来检查系统中断。

  1. 在数据库中插入uuid。
  2. 将uuid作为消息发送到jms队列。
  3. 在远程监听器上收听消息。
  4. 检查uuid是否存在于DB中?
  5. 以下是完整的代码:https://github.com/ameyjadiye/mq-fury

    这样我只想确保当远程监听器在db中检查数据时,数据始终存在于db中。

    我在系统上运行1k消息并且现在一切正常,是否有可能检查失败?我没有明确管理数据库事务,我还需要在这里做更多的设置吗?

    <bean id = "messageListenerContainer2" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
        <property name="connectionFactory" ref="connectionFactory"/>
        <property name="destinationName" value="real_queue"/>
        <property name="messageListener" ref="jmsMessageListener2"/>
        <property name="cacheLevel" value="1"/>
        <property name="concurrency" value="5-5" />
        <property name="sessionTransacted" value="true"/>
        <property name="transactionManager" ref="jmsTransactionManager"/>
      </bean>
    
      <bean id="jmsTransactionManager" class="org.springframework.jms.connection.JmsTransactionManager">
        <property name="connectionFactory" ref="connectionFactory" />
      </bean>
         <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
            <constructor-arg ref="dataSource"/>
          </bean>
    
         <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    
                <property name="driverClassName" value="com.mysql.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://192.168.0.102:3306/test" />
                <property name="username" value="root" />
                <property name="password" value="r00T" />
            </bean>
    

    这是一个独立的应用程序在春天,尝试使用 ChainedTrnsactionManager ,但它使系统运行缓慢

1 个答案:

答案 0 :(得分:1)

您的配置看起来不像支持两阶段提交事务。当使用Spring作为2PC的事务管理器时,您需要使用JtaTransactionManager,它将在内部使用JTA容器(所有符合EE的服务器)提供的实际JTA事务管理器,或者使用{{3}等独立事务管理器。 }或Bitrionix。有关示例示例,请查看Atomikos