2011-06-03 119 views
2

情况是我们希望使用XA事务来协调ActiveMQ和Hibernate(Sql Server 2008)之间的活动。ActiveMQ JMS XA Atomikos - 事务未启动错误

我们使用:

  • 春3.0.5
  • 的Hibernate 3.6.2
  • 的ActiveMQ 5.5.0
  • Atomikos公司3.7

我们看到下面的错误越来越在与事务相关的日志文件中生成的文件尚未启动。这些总是与JMS相关的。

交易'[ID]'尚未启动。

这些会一直生成到日志中。

的问题是在这要复杂得多,我们必须具有相同JMS队列工作,似乎是错误不会只有一个Web应用程序运行时生成3的Web应用程序。

这些部署用于分隔运行在同一台计算机上的Tomcat 7.0.14的实例。

2011-05-31 15:04:27,065 [Atomikos:30] WARN - [com.atomikos.diagnostics.Slf4jConsole] : XA resource 'XAJMS': rollback for XID '3139322E3136382E302E35332E746D30363636333030303031:3139322E3136382E302E35332E746D36363633' raised 0: unknown 
javax.transaction.xa.XAException: Transaction 'XID:1096044365:3139322e3136382e302e35332e746d30363636333030303031:3139322e3136382e302e35332e746d36363633' has not been started. 
    at org.apache.activemq.TransactionContext.toXAException(TransactionContext.java:732) 
    at org.apache.activemq.TransactionContext.rollback(TransactionContext.java:497) 
    at com.atomikos.datasource.xa.XAResourceTransaction.rollback(XAResourceTransaction.java:690) 
    at com.atomikos.icatch.imp.RollbackMessage.send(RollbackMessage.java:72) 
    at com.atomikos.icatch.imp.PropagationMessage.submit(PropagationMessage.java:111) 
    at com.atomikos.icatch.imp.Propagator$PropagatorThread.run(Propagator.java:87) 
    at com.atomikos.icatch.imp.Propagator.submitPropagationMessage(Propagator.java:66) 
    at com.atomikos.icatch.imp.HeurHazardStateHandler.onTimeout(HeurHazardStateHandler.java:124) 
    at com.atomikos.icatch.imp.CoordinatorImp.alarm(CoordinatorImp.java:1105) 
    at com.atomikos.timing.PooledAlarmTimer.notifyListeners(PooledAlarmTimer.java:112) 
    at com.atomikos.timing.PooledAlarmTimer.run(PooledAlarmTimer.java:99) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
    at java.lang.Thread.run(Thread.java:662) 
Caused by: javax.transaction.xa.XAException: Transaction 'XID:1096044365:3139322e3136382e302e35332e746d30363636333030303031:3139322e3136382e302e35332e746d36363633' has not been started. 
    at org.apache.activemq.broker.TransactionBroker.getTransaction(TransactionBroker.java:290) 
    at org.apache.activemq.broker.TransactionBroker.rollbackTransaction(TransactionBroker.java:177) 
    at org.apache.activemq.broker.MutableBrokerFilter.rollbackTransaction(MutableBrokerFilter.java:131) 
    at org.apache.activemq.broker.TransportConnection.processRollbackTransaction(TransportConnection.java:436) 
    at org.apache.activemq.command.TransactionInfo.visit(TransactionInfo.java:104) 
    at org.apache.activemq.broker.TransportConnection.service(TransportConnection.java:306) 
    at org.apache.activemq.broker.TransportConnection$1.onCommand(TransportConnection.java:179) 
    at org.apache.activemq.transport.TransportFilter.onCommand(TransportFilter.java:69) 
    at org.apache.activemq.transport.WireFormatNegotiator.onCommand(WireFormatNegotiator.java:113) 
    at org.apache.activemq.transport.InactivityMonitor.onCommand(InactivityMonitor.java:227) 
    at org.apache.activemq.transport.TransportSupport.doConsume(TransportSupport.java:83) 
    at org.apache.activemq.transport.tcp.TcpTransport.doRun(TcpTransport.java:220) 
    at org.apache.activemq.transport.tcp.TcpTransport.run(TcpTransport.java:202) 
    at java.lang.Thread.run(Unknown Source) 

我们的Spring配置:

<Resource name="jms/ConnectionFactory" 
    auth="Container" 
    type="org.apache.activemq.ActiveMQXAConnectionFactory" 
    description="JMS XA Connection Factory" 
    factory="org.apache.activemq.jndi.JNDIReferenceFactory" 
    brokerURL="tcp://${activemq.server.name}:${activemq.server.port}" 
    brokerName="LocalActiveMQBroker" /> 


<bean id="atomikosConnectionFactory" 
     class="com.atomikos.jms.AtomikosConnectionFactoryBean" 
     init-method="init" destroy-method="close"> 
    <property name="uniqueResourceName" value="XAJMS" /> 
    <property name="xaConnectionFactory" ref="jmsConnectionFactory" /> 
    <property name="maxPoolSize" value="40" /> 
</bean> 

<bean id="getSomeStuffListenerAdapter" 
     class="org.springframework.jms.listener.adapter.MessageListenerAdapter"> 
    <property name="delegate" ref="targetElement" /> 
    <property name="defaultListenerMethod" value="doStuff" /> 
    <property name="messageConverter" ref="myMessageConverter" /> 
</bean> 

<bean id="getSomeStuffListenerContainer" 
     class="org.springframework.jms.listener.DefaultMessageListenerContainer" 
     depends-on="txManager"> 
    <property name="connectionFactory" ref="atomikosConnectionFactory"/> 
    <property name="destination" ref="jmsQueue01"/> 
    <property name="messageListener" ref="getSomeStuffListenerAdapter" /> 
    <property name="concurrency" value="5-10" /> 
    <property name="transactionManager" ref="txManager" /> 
    <property name="sessionTransacted" value="true" /> 
</bean> 

<bean id="atomikosTransactionManager" 
     class="com.atomikos.icatch.jta.UserTransactionManager" 
     depends-on="dataSource, atomikosConnectionFactory" 
     init-method="init" destroy-method="close"> 
    <property name="forceShutdown" value="false" /> 
</bean> 

<bean id="txManager" 
     class="org.springframework.transaction.jta.JtaTransactionManager"> 
    <property name="transactionManager" ref="atomikosTransactionManager" /> 
</bean> 

回答

5

好运行时,在同一台机器上3个Tomcat Web应用程序,使用Atomikos公司,这是指向同一服务器的ActiveMQ,我们有这个问题。

应用程序在单独的Atomikos日志文件的独立Tomcat实例中运行。

问题是XA XID(事务ID)在三个应用程序中不是唯一的,这导致ActiveMQ感到困惑。这是由于在同一台机器上运行的实例。

如果您将Atomikos和ActiveMQ日志记录设置为TRACE。然后您可以看到两个或更多应用程序生成相同的XID。

这是因为Atomikos公司属性设置的:com.atomikos.icatch.tm_unique_name

如果没有设置,那么生成所述XID,这是对于三个相同的当机器的IP地址被用于应用程序并导致冲突。

这个问题只有在3个Tomcat应用程序开始彼此非常接近时才可能发生。

因此,将com.atomikos.icatch.tm_unique_name设置为对每个Web应用程序都是唯一的,并且问题消失。