Activemq JAVA-Spring集成流事务&x2B;com.atomikos.icatch.HeurHazardException:启发式异常

Activemq JAVA-Spring集成流事务&x2B;com.atomikos.icatch.HeurHazardException:启发式异常,activemq,spring-integration,ibm-mq,spring-transactions,atomikos,Activemq,Spring Integration,Ibm Mq,Spring Transactions,Atomikos,我试图将事务性流程作为Spring集成的整个流程,该流程从IBM MQ队列的适配器开始,然后我们有一个包含ActiveMQ队列的复杂流程,我得到一个com.atomikos.icatch.HeurHazardException:atomikos尝试注册资源时的启发式异常 <bean id="inputChannelQueue" class="org.apache.activemq.command.ActiveMQQueue"> <constructor-arg valu

我试图将事务性流程作为Spring集成的整个流程,该流程从IBM MQ队列的适配器开始,然后我们有一个包含ActiveMQ队列的复杂流程,我得到一个com.atomikos.icatch.HeurHazardException:atomikos尝试注册资源时的启发式异常

<bean id="inputChannelQueue" class="org.apache.activemq.command.ActiveMQQueue">
    <constructor-arg value="INPUT" />
</bean>

<jms:channel id="inputChannel" queue="inputChannelQueue">
    <jms:interceptors>
        <int:wire-tap channel="inputLoggingChannel"/>
    </jms:interceptors>
</jms:channel>


<jms:message-driven-channel-adapter id="MQInboundGateway"
                                     connection-factory="mqConnectionFactoryCache"
                                     destination="mqInboundQueue"   
                                     channel="inputChannel"
                                     concurrent-consumers="20"
                                      cache-level="3" acknowledge="transacted" />

.
. //OTHER SPRING INTEGRATION ELEMENTS
.
<int:channel id="concentradorOutputChannel" /> //Final Channel to the output adapter.

<!-- ATOMIKOS BEANS -->
<bean id="userTransactionService" class="com.atomikos.icatch.config.UserTransactionServiceImp"  init-method="init" destroy-method="shutdownForce">
    <constructor-arg>
    <!-- IMPORTANT: specify all Atomikos properties here -->
        <props>
            <prop key="com.atomikos.icatch.service">
            com.atomikos.icatch.standalone.UserTransactionServiceFactory
            </prop>
        </props>
    </constructor-arg>      
</bean>

<bean id="AtomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager"    init-method="init" destroy-method="close" depends-on="userTransactionService">
    <property name="startupTransactionService" value="false" />
    <property name="forceShutdown" value="false" />
</bean>

<bean id="AtomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp"   depends-on="userTransactionService">
    <property name="transactionTimeout" value="300" />
</bean>

<!-- //================= TX BEANS  =================// -->

 <bean id="JtaTransactionManager"   class="org.springframework.transaction.jta.JtaTransactionManager"   depends-on="userTransactionService">
    <property name="transactionManager" ref="AtomikosTransactionManager" />
    <property name="userTransaction" ref="AtomikosUserTransaction" />
 </bean>

<aop:config>
    <aop:advisor advice-ref="txAdvice" pointcut="bean(inputChannel)" />
</aop:config>

<tx:advice id="txAdvice" transaction-manager="JtaTransactionManager">
    <tx:attributes>
        <tx:method name="send" />
    </tx:attributes>
</tx:advice>
这是我的applicationContext.xml

<bean id="mqConnectionFactory"                     class="com.ibm.mq.jms.MQQueueConnectionFactory">
    <property name="hostName" value="${ibm.mq.connection.url}" />
    <property name="port" value="${ibm.mq.connection.port}" />
    <property name="transportType" value="${ibm.mq.conection.type}" />
    <property name="queueManager" value="${ibm.mq.conection.queuemanager}"          />
    <property name="channel" value="${ibm.mq.conection.channel}" />
</bean>

<bean id="mqConnectionFactoryCache"
    class="org.springframework.jms.connection.CachingConnectionFactory">
    <property name="targetConnectionFactory" ref="mqConnectionFactory" />
    <property name="sessionCacheSize" value="10" />
    <property name="cacheConsumers" value="true"></property>
</bean>

<bean id="mqInboundQueue" class="com.ibm.mq.jms.MQQueue">
    <constructor-arg value="${ibm.mq.conection.queue}" />
</bean>

<bean id="amqConnectionFactory" class="org.apache.activemq.ActiveMQXAConnectionFactory">
    <!-- brokerURL -->
    <property name="brokerURL" value="${active.mq.connection.url}" />
    <property name="redeliveryPolicy" ref="amqRedeliveryPolicy"></property>
</bean>

<bean id="amqRedeliveryPolicy" class="org.apache.activemq.RedeliveryPolicy">
    <property name="maximumRedeliveries" value="5"></property>
    <property name="redeliveryDelay" value="1000"></property>
</bean>

<bean id="atmConnectionFactory"   class="com.atomikos.jms.AtomikosConnectionFactoryBean"  
          init-method="init" destroy-method="close"> 
  <property name="uniqueResourceName" value="INPUT" /> 
  <property name="xaConnectionFactory" ref="amqConnectionFactory" /> 
<bean id="inputChannelQueue" class="org.apache.activemq.command.ActiveMQQueue">
    <constructor-arg value="INPUT" />
</bean>

<jms:channel id="inputChannel" queue="inputChannelQueue">
    <jms:interceptors>
        <int:wire-tap channel="inputLoggingChannel"/>
    </jms:interceptors>
</jms:channel>


<jms:message-driven-channel-adapter id="MQInboundGateway"
                                     connection-factory="mqConnectionFactoryCache"
                                     destination="mqInboundQueue"   
                                     channel="inputChannel"
                                     concurrent-consumers="20"
                                      cache-level="3" acknowledge="transacted" />

.
. //OTHER SPRING INTEGRATION ELEMENTS
.
<int:channel id="concentradorOutputChannel" /> //Final Channel to the output adapter.

<!-- ATOMIKOS BEANS -->
<bean id="userTransactionService" class="com.atomikos.icatch.config.UserTransactionServiceImp"  init-method="init" destroy-method="shutdownForce">
    <constructor-arg>
    <!-- IMPORTANT: specify all Atomikos properties here -->
        <props>
            <prop key="com.atomikos.icatch.service">
            com.atomikos.icatch.standalone.UserTransactionServiceFactory
            </prop>
        </props>
    </constructor-arg>      
</bean>

<bean id="AtomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager"    init-method="init" destroy-method="close" depends-on="userTransactionService">
    <property name="startupTransactionService" value="false" />
    <property name="forceShutdown" value="false" />
</bean>

<bean id="AtomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp"   depends-on="userTransactionService">
    <property name="transactionTimeout" value="300" />
</bean>

<!-- //================= TX BEANS  =================// -->

 <bean id="JtaTransactionManager"   class="org.springframework.transaction.jta.JtaTransactionManager"   depends-on="userTransactionService">
    <property name="transactionManager" ref="AtomikosTransactionManager" />
    <property name="userTransaction" ref="AtomikosUserTransaction" />
 </bean>

<aop:config>
    <aop:advisor advice-ref="txAdvice" pointcut="bean(inputChannel)" />
</aop:config>

<tx:advice id="txAdvice" transaction-manager="JtaTransactionManager">
    <tx:attributes>
        <tx:method name="send" />
    </tx:attributes>
</tx:advice>
我需要从inputChannel到Concentrador OutputChannel的整个流程都在TX内

<bean id="inputChannelQueue" class="org.apache.activemq.command.ActiveMQQueue">
    <constructor-arg value="INPUT" />
</bean>

<jms:channel id="inputChannel" queue="inputChannelQueue">
    <jms:interceptors>
        <int:wire-tap channel="inputLoggingChannel"/>
    </jms:interceptors>
</jms:channel>


<jms:message-driven-channel-adapter id="MQInboundGateway"
                                     connection-factory="mqConnectionFactoryCache"
                                     destination="mqInboundQueue"   
                                     channel="inputChannel"
                                     concurrent-consumers="20"
                                      cache-level="3" acknowledge="transacted" />

.
. //OTHER SPRING INTEGRATION ELEMENTS
.
<int:channel id="concentradorOutputChannel" /> //Final Channel to the output adapter.

<!-- ATOMIKOS BEANS -->
<bean id="userTransactionService" class="com.atomikos.icatch.config.UserTransactionServiceImp"  init-method="init" destroy-method="shutdownForce">
    <constructor-arg>
    <!-- IMPORTANT: specify all Atomikos properties here -->
        <props>
            <prop key="com.atomikos.icatch.service">
            com.atomikos.icatch.standalone.UserTransactionServiceFactory
            </prop>
        </props>
    </constructor-arg>      
</bean>

<bean id="AtomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager"    init-method="init" destroy-method="close" depends-on="userTransactionService">
    <property name="startupTransactionService" value="false" />
    <property name="forceShutdown" value="false" />
</bean>

<bean id="AtomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp"   depends-on="userTransactionService">
    <property name="transactionTimeout" value="300" />
</bean>

<!-- //================= TX BEANS  =================// -->

 <bean id="JtaTransactionManager"   class="org.springframework.transaction.jta.JtaTransactionManager"   depends-on="userTransactionService">
    <property name="transactionManager" ref="AtomikosTransactionManager" />
    <property name="userTransaction" ref="AtomikosUserTransaction" />
 </bean>

<aop:config>
    <aop:advisor advice-ref="txAdvice" pointcut="bean(inputChannel)" />
</aop:config>

<tx:advice id="txAdvice" transaction-manager="JtaTransactionManager">
    <tx:attributes>
        <tx:method name="send" />
    </tx:attributes>
</tx:advice>

谢谢您的帮助。

已解决,只需删除文件tmlog.lck和tmlog6.log

已解决,只需删除文件tmlog.lck和tmlog6.log很高兴听到!请将您的解决方案描述为一个答案,并接受它以从“未回答”堆中筛选此问题
<bean id="inputChannelQueue" class="org.apache.activemq.command.ActiveMQQueue">
    <constructor-arg value="INPUT" />
</bean>

<jms:channel id="inputChannel" queue="inputChannelQueue">
    <jms:interceptors>
        <int:wire-tap channel="inputLoggingChannel"/>
    </jms:interceptors>
</jms:channel>


<jms:message-driven-channel-adapter id="MQInboundGateway"
                                     connection-factory="mqConnectionFactoryCache"
                                     destination="mqInboundQueue"   
                                     channel="inputChannel"
                                     concurrent-consumers="20"
                                      cache-level="3" acknowledge="transacted" />

.
. //OTHER SPRING INTEGRATION ELEMENTS
.
<int:channel id="concentradorOutputChannel" /> //Final Channel to the output adapter.

<!-- ATOMIKOS BEANS -->
<bean id="userTransactionService" class="com.atomikos.icatch.config.UserTransactionServiceImp"  init-method="init" destroy-method="shutdownForce">
    <constructor-arg>
    <!-- IMPORTANT: specify all Atomikos properties here -->
        <props>
            <prop key="com.atomikos.icatch.service">
            com.atomikos.icatch.standalone.UserTransactionServiceFactory
            </prop>
        </props>
    </constructor-arg>      
</bean>

<bean id="AtomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager"    init-method="init" destroy-method="close" depends-on="userTransactionService">
    <property name="startupTransactionService" value="false" />
    <property name="forceShutdown" value="false" />
</bean>

<bean id="AtomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp"   depends-on="userTransactionService">
    <property name="transactionTimeout" value="300" />
</bean>

<!-- //================= TX BEANS  =================// -->

 <bean id="JtaTransactionManager"   class="org.springframework.transaction.jta.JtaTransactionManager"   depends-on="userTransactionService">
    <property name="transactionManager" ref="AtomikosTransactionManager" />
    <property name="userTransaction" ref="AtomikosUserTransaction" />
 </bean>

<aop:config>
    <aop:advisor advice-ref="txAdvice" pointcut="bean(inputChannel)" />
</aop:config>

<tx:advice id="txAdvice" transaction-manager="JtaTransactionManager">
    <tx:attributes>
        <tx:method name="send" />
    </tx:attributes>
</tx:advice>